|
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 9
|
||||||
Чем же макрос define так плох?08.01.2010, 03:29. Показов 20608. Ответов 115
После прочтения про директиву препроцессора define возник вопрос по поводу применения define, как функции:
0
|
||||||
| 08.01.2010, 03:29 | |
|
Ответы с готовыми решениями:
115
Чем так плох чипсет P31? чем плох mysql_query Чем плох uCoz? |
|
|
||||
| 22.10.2015, 23:41 | ||||
![]() Не по теме: Ушёл в игнор
0
|
||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 22.10.2015, 23:49 | ||
|
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 23.10.2015, 19:31 | ||||||||
|
если мы у константы хотим срисовать адрес объекта, то компилятор будет вынужден где то разместить её, что бы этот адрес вообще было с чего брать. но если мы адреса не просили, то компилятор запросто профигачит inline подстановками везде по месту использования. для него подставить циферку 10 (например, пусть это будет значение константы) так же просто, как препроцессору подставить эту же циферку по местам использования макроса. Добавлено через 10 минут нужно просто понимать: пока у фундаментальной константы не попросили адреса, память она кушать не будет. пример: http://rextester.com/LZZDC26614
то все равно под неё не будет выделяться память, пока кому нибудь не понадобится адрес объекта. потому что совершенно очевидно: что бы тупо подставлять значение константы по месту использования, память под сам объект выделять не обязательно.
1
|
||||||||
|
|
||
| 24.10.2015, 01:05 | ||
|
А что такое адрес константы - я вообще не понимаю. В твоём случае n - это автоматическая переменная, а не константа. Я вообще слабо понимаю, что вы тут придумали на предмет того, выделяется память под константу, или нет. Когда LynXzp об этом говорил, я ещё хоть как-то его понимал, потому что знал, что он на ломанном языке изъясняется (у него были опасения, что лишний define или элемент enum'а попадают в код). Что говоришь ты - я не понимаю вообще ничего По мне так если есть вопрос на предмет того, что и как попадает в код, то пишешь исходник, компилируешь до ассемблерного файла и смотришь результат, вместо того, чтобы заниматься гаданиями и предположениями
1
|
||
|
1 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 6
|
||||||||||||||||||
| 24.10.2015, 01:07 | ||||||||||||||||||
|
По поводу памяти, да, по идее должно отсекать константу, но несовсем:
without.c:
avr-gcc with.c -o with.o avr-gcc with2.c -o with2.o md5 with*o MD5 (with.o) = 20cef9a881abf45a705ee4a866e7d535 MD5 (with2.o) = a039418acfd289c805508efee49fc84d MD5 (without.o) = 3213727e8abd00fd988b201612bcbf27 rm *.o avr-gcc -Wl,--gc-sections without.c -o without.o avr-gcc -Wl,--gc-sections with.c -o with.o avr-gcc -Wl,--gc-sections with2.c -o with2.o md5 with*o MD5 (with.o) = 53a3f6dc92a6fa67272464a500dc9ce2 MD5 (with2.o) = 53a3f6dc92a6fa67272464a500dc9ce2 MD5 (without.o) = 53a3f6dc92a6fa67272464a500dc9ce2 gcc версия 4.8.3 (GCC) Добавил ключик в свой Makefile (хотя ж знал про него)И вообще это линковщик, а не компилятор, этим занимается. Не факт что у всех по умолчанию стоит -Wl,--gc-sections или аналог. _____________________
а это тоже важно.
_____________________ Для себя понял: 1. Сами по себе, макросы константы вообще не могут навредить (#define a n это ... зачем ... в принципе может понадобится, но проще обойтись). 2. В макросы-функции нужно передавать только значения. (Нельзя передавать выражения и функции) И тоже все будет хорошо. (Нечего место экономить, никогда не пишу ++ не в отдельном выражении, только мозг выносить себе, потом это читая) 3. Макросы безопасны как и указатели, и в определенных случаях не проверка границ массива. Но применять надо осторожно, а шутники и assert(random) могут написать, никто же не будет говорить что assert это плохо. *Танцуем с лезвиями в руках*
0
|
||||||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||
| 24.10.2015, 11:38 | ||||||||||||||
|
потому что совершенно не важно: ни что именно учудил товарищ, ни что он там себе думает. не нужно видеть конкретный код, что бы понимать, что под константы не выделяется память, если не используются их адреса. но на всякий случай оставил пример-иллюстрацию с выдержкой кода и демонстрацией на онлайн компиляторе. обратите внимание: значение константы используется в качестве параметра шаблона. это возможно только и только в одном случае: константа времени компиляции. по поводу адреса константы поясню:
а вот что там за ассмовыхлоп получится - монопенисуальный фактор, и геммор компилятора, а не программиста. вот вам ещё один пример:
но не требует этого для фундаментальных констант? потому что не константы, или не фундаментальные типы нужно где то размещать в памяти. в данном случае в статической. и нужно знать - где. но фундаментальные константы память не кушают. поэтому их можно определить прямо в хэдере. здесь мы кстати, наблюдаем один из величайших косяков в дизайне языка: если мы попросим адрес у такой константы, то... о боже! все будет по прежнему работать, как часики. дело в том, что разработчики компиляторов, уже давным давно порешали и проблему выделения памяти под константу. и проблему выделения памяти под статическую фундаментальную константу. поэтому, нет никаких технических ограничений, применить механизм автоматической аллокации статического объекта, определенного в хэдэре. то есть, они ещё давным давно могли позволить определять в хэдерах не только фундаментальные константы, но и любые другие объекты. в настоящий же момент ограничение "только для фундаментальных констант" снято только и только для шаблонов.
2
|
||||||||||||||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||
| 24.10.2015, 13:19 | |||
constexpr.
1
|
|||
|
|
|||
| 24.10.2015, 13:45 | |||
|
Из всего твоего большого текста я понял, что словом "константа" ты называешь "переменную с квалификатором const". Хотя LynXzp изначально поднимал вопрос о define и enum'ах. В общем классический для форумов вариант, когда спрашивают о том, как нарисовать зелёный круг, а отвечают про то, как варить суп, и при этом кастрюлю называют словом "паровоз"
Добавлено через 13 минут Хотя вполне возможно, что это я неправильно понял фразу "А константы это издевательство, они же будут занимать память все вне зависимости от использования" и LynXzp тоже называет "константой" переменную с квалифиатором const. Тогда согласен - я неправильно понял вас обоих. Но здесь я руководствуюсь стандартным принципом - я всегда исхожу из того, что новичок может изъясняться корявым языком, но знающий человек обычно называет вещи своими именами Добавлено через 4 минуты Добавлено через 2 минуты
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 24.10.2015, 14:01 | ||||
|
потому что формально она вообще не будет существовать, пока вы не попросите её адрес. например, float не является интегральным, однако для него это так же срабатывает. константой я называю объект рожденный константным.
1
|
||||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||||
| 24.10.2015, 14:25 | |||||||||||||
constexpr. Пример.
1
|
|||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||
| 24.10.2015, 14:30 | ||||||||||||||||||
|
компилятору пофигу:
замените на шаблон от T и получите тоже самое поведение для T. (правда синтаксис будет иным, но не суть)
0
|
||||||||||||||||||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||
| 24.10.2015, 14:34 | |||
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 24.10.2015, 14:40 | |
|
0
|
|
|
|
||
| 24.10.2015, 14:42 | ||
|
C++ const int a = 10; int foo (void) { return a; } Code $ g++ t.cc -S $ cat t.s ... __Z3foov: ... movl $10, %eax <--- в точку "return a" компилятор подставил 10 ... .section .rdata,"dr" .align 4 __ZL1a: .long 10 <--- но переменная никуда не делась ... Можно копнуть дальше и подать этот же код на вход компилятора Си (переименовав t.cc в t.c). И мы увидим, что в этом случае даже в режиме с оптимизациями переменная НЕ была удалена. Почему так происходит? Да потому что эти два кода (один и тот же текст в режимах Си и Си++) НЕ эквивалентны. В режиме Си++ на глобальные переменные с квалификатором const неявно навешивается модификатор static. И эквивалентный код на Си должен выглядеть как C static const int a = 10; int foo (void) { return a; }
0
|
||
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||
| 24.10.2015, 14:47 | ||||
|
Добавлено через 3 минуты
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 24.10.2015, 16:27 | ||||||
|
в дебаге компилятор может и не выпиливать промежуточные значения. ну и? Добавлено через 3 минуты по стандарту компиляторы могут выполнять любые оптимиации, которые не противоречат изначальной "лочической машине", задаваемой пользотвалем в исходном тескте. есть исключение - конструкторы копии, либо r-value конструкторы. эти компилятор может оптимизировать невзирая на их возможные эффекты. Добавлено через 3 минуты
0
|
||||||
|
|
|||
| 24.10.2015, 16:34 | |||
|
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 24.10.2015, 16:50 | |||
|
1. на каких нибудь микроволноффках особенно критично не делать избыточных объектов. 2. мой пример кода выше написан согласно стандатру. а из этого следует, что любой копилятор обязан уметь делать inline подстановку по месту использования фундаментальной константы. итого: все топовые компиляторы умеют оптимизировать промежуточные значение. компиляторы для микроволновок - и подавно это умеют.
0
|
|||
| 24.10.2015, 16:50 | |
|
Чем плох goto? Чем плох make? Чем плох управляемый С++?
Чем плох ProBuilder (Unity3D)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат»
Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
|
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
|