|
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 9
|
||||||
Чем же макрос define так плох?08.01.2010, 03:29. Показов 20600. Ответов 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)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
По ссылке 403. Не очень информативно такую ссылку постить.
Запись от Usaga размещена Сегодня в 06:46 . . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|