![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Всем привет. Потребовалось написать метапрограмку и стопорнулся на ровном месте. Суть: необходимо вычислить выражение sizeof("/какая-либо строка/").
Проблема возникает в том, что выражение-то вычисляется правильно, но та самая "/какая-либо строка/" присутствует в коде программы, а факт ее отсутствия является целью написания. Пробовал заменить выражение на константу - все ОК. Т.е. дело именно в sizeof. Пишу для GCC из под Linux'а. Так вот и возникает вопрос: что с этим можно сделать чтобы и вычисление длины проходило и строка в программе не присутствовала. PS Может есть что другое, что работает схожим с sizeof образом? Заранее благодарю. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Для строк есть strlen(const char*)
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
она заменяется на константу во время компиляции?
Мне нельзя использовать переменные. Это сообщение отредактировал(а) fry - 19.11.2009, 00:57 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
fry, тут есть небольшие сложности в определении. Размер строки или ее длинна. Для строк char* длинна всегда меньше ее размера, поскольку не учитывает последний ноль. Но на самом деле размер может быть гораздо больше длинны, поскольку длинна определяется завершающим нулем, а он необязательно в конце выделенного участка памяти. Реальный размер буфера памяти знает только компилятор. Если указатель на строку совпадает с указателем на выделенную память (что не факт) и если строка выделена в куче, то размер выделенной памяти храниться примерно в -8мом байте (размер 4 байта), но это не стандартизировано и зависит от компилятора, так что на это неверно рассчитывать. Правильнее было бы использовать строки STL, для которых всегда известен и размердлина (size) и размер выделенной памяти (capacity).
Добавлено через 3 минуты и 55 секунд А как же Если строка не присутствует, то она переменная. Переменная не имеет фиксированного значения, поэтому ее размер нельзя знать на этапе компиляции. Это сообщение отредактировал(а) Alexeis - 19.11.2009, 00:58 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Интересует именно количество значимых символов (до завершающего нуля). Строка должна быть соптимизированна до результата, т.е. вместо этого выражения должна остаться константа, при этом самой строки в программе существовать не должно.
Общая концепция здесь. Это сообщение отредактировал(а) fry - 19.11.2009, 01:12 |
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Всегда ими пользуюсь и понимаю о чем вы говорите, однако необходимый результат далеко не факт что получится т.к. скорее всего для строки создается переменная и соптимизировать ее не получится, а также проблема будет в том, что результирующее значение не может быть lvalue, что, к сожалению, подтверждается исходя из типа возвращаемого значения методов строк из STL, т.к. мне его необходимо использовать при создании шаблона, а также сам факт вызова функции в данном контексте противоречит стандарту. Это сообщение отредактировал(а) fry - 19.11.2009, 01:58 |
|||
|
||||
| fry |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Пока пришло в голову только такое
С одной стороны работает, с другой нет. Дело в том, что провоцируя ошибку таким образом
компилятор сообщает, что не может найти подходящего вызова для const char[xxx], что подтверждает итак понятное. Однако, sizeof возвращаемого значения первого приведенного мной варианта (без ошибки) выводит одно и тоже- 4. Такое впечатление, что возвращается ссылка на тот самый const char[xxx]. |
||||
|
|||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ничего не путаете?
|
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
fry, определить размер строки на этапе компиляции можно так:
|
|||
|
||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Это кусок кода или весь? Подозреваю, что кусок т.к. у меня код существенно больше и присутствует код перед функцией main. Неважно, будем думать. Пес его знает как он оптимизирует. У меня этот sizeof был как параметр шаблона может это на что влияет, хотя врядли.
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если это вопрос ко мне - то весь
Можно кусок кода, где это было? |
||||
|
|||||
| fry |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Всем спасибо за ответы.
С таким выводом не поспоришь, ведь если есть интерес к длине строки, то ее содержание как видимо также небезинтересно.
Спасибо за подсказку. Уже пробовал, только реализовывал в классе. Эффект ноль. Думаю вся проблема в присутствии указателей (константных) при передаче строки как параметра метода. Только вот перепробовав туеву хучу различных вариантов могу сказать, что компилятору в некоторых из них не помешало избавиться от нее в коде программы. Есть идея передавать как boost::mpl::string, но синтаксис у них отвратительный в плане передачи больших строк. Или я чего-то недопонял. Хотелось бы передать строку большого размера и обрабатывать ее таким образом, чтобы компилятор ее не вносил в код программы, т.к. сама по себе она не нужна. |
||||||
|
|||||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
"Доделал" пример bsa
Это сообщение отредактировал(а) Леопольд - 20.11.2009, 18:42 -------------------- вопросов больше чем ответов |
||||
|
|||||
| fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Спасибо за код. В принципе, я уже проделывал похожий вариант, но, как и этот, он ни к чему ни привел. Думаю я просто поспешил с выводом насчет виновности sizeof. Есть ли вообще варианты реализации подобия бустовского хранения строк из mpl с нормальной поддержкой строк большой длины. Просто, как я понял, он работает с ними с гарантией работы только во время компиляции, что для меня как раз принципиально важно. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мне кажется логичнее внутри структуры объявить енум вместо массива и тогда вместо sizeof(StaticLength...) будет StaticLength.value. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |