|
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 9
|
||||||
Чем же макрос define так плох?08.01.2010, 03:29. Показов 20565. Ответов 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)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|