Форум программистов, компьютерный форум CyberForum.ru

Чем же макрос define так плох? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.90
ertyuo
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 3
08.01.2010, 03:29     Чем же макрос define так плох? #1
После прочтения про директиву препроцессора define возник вопрос по поводу применения define, как функции:
C++
1
#define QQ (q) (q^q)
Можно же улучшить читаемость кода, используя вместо функций именно директиву define. Или у данного использования макроса есть подводные камки какие-то? Да и объем кода в разы сократиться, так как для define будет достаточно всего-навсего одной строчки.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2010, 03:29     Чем же макрос define так плох?
Посмотрите здесь:

Объясните, в чем суть директив #ifndef/#define/#endif C++
C++ Чем оличается define от const
Чем плох C++
C++ В чем ошибка? что не так?
#define работает не так, как ожидается C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
22.10.2015, 23:41     Чем же макрос define так плох? #41
Цитата Сообщение от Renji Посмотреть сообщение
"Сейчас специально скомпилировал в g++ программу с неиспользуемой константой и вообще без константы
Исходник, судя по всему, опять засекречен

Цитата Сообщение от Renji Посмотреть сообщение
И да, неиспользуемый массив размером 1 элемент, занимает столько же памяти сколько неиспользуемый массив на 4 элемента
Бугога. Добавь в код использование

Цитата Сообщение от Renji Посмотреть сообщение
Потому как и тот, и тот, скорее всего выкидываются оптимизатором к чертовой матери
В очередной раз блеснул пониманием работы компилятора. Далеко пойдёшь

Не по теме:

Ушёл в игнор

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
22.10.2015, 23:49     Чем же макрос define так плох? #42
Цитата Сообщение от Evg Посмотреть сообщение
Бугога. Добавь в код использование
Для забывчивых я специально напоминал что разговор был о тезисе LynXzp "А константы это издевательство, они же будут занимать память все вне зависимости от использования". А не о том, что используемые константы/массивы кушают память. Вот уж воистину бугога.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
23.10.2015, 19:31     Чем же макрос define так плох? #43
Цитата Сообщение от Renji Посмотреть сообщение
А не о том, что используемые константы/массивы кушают память
даже используемые не кушают, пока мы не попросим их адресов.


если мы у константы хотим срисовать адрес объекта,
то компилятор будет вынужден где то разместить её,
что бы этот адрес вообще было с чего брать.

но если мы адреса не просили,
то компилятор запросто профигачит inline подстановками
везде по месту использования.

для него подставить циферку 10
(например, пусть это будет значение константы) так же просто,
как препроцессору подставить эту же циферку по местам использования макроса.

Добавлено через 10 минут
Цитата Сообщение от Evg Посмотреть сообщение
Гадать можно сколько угодно.
не нужно ничего гадать.

нужно просто понимать:
пока у фундаментальной константы не попросили адреса,
память она кушать не будет.

пример:

http://rextester.com/LZZDC26614

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
 
template<size_t N> struct kokoko
{
    kokoko() { std::cout << N << std::endl; }
};
 
int main()
{
    
    std::cout << "Hello, world!\n";
    
    const size_t n = 10;
    kokoko<n> ololo;    //<--- значение константы известно времени компиляции
                     // поэтому наравне с енумом можно использовать 
        //в метапрограммировании
 
    //в качестве количества элементов массивов
 
    // и тп
}
более того, даже если константа и не является константой времени компиляции,
то все равно под неё не будет выделяться память,
пока кому нибудь не понадобится адрес объекта.

потому что совершенно очевидно:
что бы тупо подставлять значение константы
по месту использования,
память под сам объект выделять не обязательно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 01:05     Чем же макрос define так плох? #44
Цитата Сообщение от hoggy Посмотреть сообщение
не нужно ничего гадать
Гадать нужно. Ибо товарищ не предоставил исходник, и чего он там мерил - непонятно

А что такое адрес константы - я вообще не понимаю. В твоём случае n - это автоматическая переменная, а не константа. Я вообще слабо понимаю, что вы тут придумали на предмет того, выделяется память под константу, или нет. Когда LynXzp об этом говорил, я ещё хоть как-то его понимал, потому что знал, что он на ломанном языке изъясняется (у него были опасения, что лишний define или элемент enum'а попадают в код). Что говоришь ты - я не понимаю вообще ничего

По мне так если есть вопрос на предмет того, что и как попадает в код, то пишешь исходник, компилируешь до ассемблерного файла и смотришь результат, вместо того, чтобы заниматься гаданиями и предположениями
LynXzp
1 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 6
24.10.2015, 01:07     Чем же макрос define так плох? #45
По поводу памяти, да, по идее должно отсекать константу, но несовсем:
without.c:
C
1
2
3
void main(){
 while(1);
}
with.c:
C
1
2
3
4
const int a=100;
void main(){
 while(1);
}
with2.c:
C
1
2
3
4
5
const int a=100;
const int b=101;
void main(){
 while(1);
}
avr-gcc without.c -o without.o
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 или аналог.

_____________________
даже используемые не кушают, пока мы не попросим их адресов.
Ух-ты. Не уверен что на bare-metal без ОС все так же. Но память занимаемую кодом уж точно использует а это тоже важно.
потому что совершенно очевидно:
что бы тупо подставлять значение константы
по месту использования,
память под сам объект выделять не обязательно.
Ничего не понял. Сейчас взял и сравнил свои with.o и without.o - оперативной памяти используют одинаково... Ничего не понял, там же Гарвардская архитектура, нельзя просто взять и прочитать из кода программ число. (Возможно обьем памяти посчитала утилита не верно, но больше грешу на себя. Ладно, это не так важно... пока запомню, вдруг потом пойму.)
_____________________

Для себя понял:
1. Сами по себе, макросы константы вообще не могут навредить (#define a n это ... зачем ... в принципе может понадобится, но проще обойтись).
2. В макросы-функции нужно передавать только значения. (Нельзя передавать выражения и функции) И тоже все будет хорошо.
(Нечего место экономить, никогда не пишу ++ не в отдельном выражении, только мозг выносить себе, потом это читая)
3. Макросы безопасны как и указатели, и в определенных случаях не проверка границ массива. Но применять надо осторожно, а шутники и assert(random) могут написать, никто же не будет говорить что assert это плохо.

*Танцуем с лезвиями в руках*
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 01:09     Чем же макрос define так плох? #46
Цитата Сообщение от LynXzp Посмотреть сообщение
#define a n это ... зачем
Это моделирование ситуации, когда программист стреляет себе в ногу
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 11:38     Чем же макрос define так плох? #47
Цитата Сообщение от Evg Посмотреть сообщение
Гадать нужно. Ибо товарищ не предоставил исходник, и чего он там мерил - непонятно
нет, не нужно.
потому что совершенно не важно:
ни что именно учудил товарищ,
ни что он там себе думает.

не нужно видеть конкретный код,
что бы понимать, что под константы не выделяется память,
если не используются их адреса.

Цитата Сообщение от Evg Посмотреть сообщение
А что такое адрес константы - я вообще не понимаю. В твоём случае n - это автоматическая переменная, а не константа. Я вообще слабо понимаю, что вы тут придумали на предмет того, выделяется память под константу, или нет. Когда LynXzp об этом говорил, я ещё хоть как-то его понимал, потому что знал, что он на ломанном языке изъясняется (у него были опасения, что лишний define или элемент enum'а попадают в код). Что говоришь ты - я не понимаю вообще ничего
я думал, моя мысля - предельно проста и очевидна.
но на всякий случай оставил пример-иллюстрацию с выдержкой кода
и демонстрацией на онлайн компиляторе.

обратите внимание:
значение константы используется в качестве параметра шаблона.

это возможно только и только в одном случае:
константа времени компиляции.

по поводу адреса константы поясню:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int foo(const size_t*); //<--- реализация "где то там"
   // в другой единице трансляции
   // здесь будет резолвить линкер
 
int main()
{
    const size_t n = 10;
 
    int array[n] = {}; //<--- можно, 
         // n - константа, значение которой известно времени компиляции
 
    // <--- до этого момента память под константу n не выделялась
    // потому что нигде не использовался адрес константы
    // а для того, что бы организовать массив
    // компилятору достаточно сделать inline подстановку значения константы
  
    foo(&n); //<--- а вот теперь мы попросили адрес константы
     //компилятор обязан нам его предоставить
 
     //но что бы это было возможно
     //компилятор вынужден создать реальный объект константы
     //разместив его в памяти, что бы у него появился реальный адрес
     //который мы можем получить
 
     //удалите вызов функции foo,
     //и компилятор не станет выделять память под константу
}
Добавлено через 11 минут
Цитата Сообщение от Evg Посмотреть сообщение
По мне так если есть вопрос на предмет того, что и как попадает в код, то
читаешь стандарт языка.

а вот что там за ассмовыхлоп получится - монопенисуальный фактор,
и геммор компилятора, а не программиста.

вот вам ещё один пример:


C++
1
2
3
4
5
6
struct example
{
    static const int value = 10; // <--- законный способ объявления константы 
           //с бородатых времен
      // но почему?
};
почему стандарт требует объявлять статические члены классов явно в ед. трансляций,
но не требует этого для фундаментальных констант?

потому что не константы, или не фундаментальные типы нужно где то размещать в памяти.
в данном случае в статической.
и нужно знать - где.

но фундаментальные константы память не кушают.
поэтому их можно определить прямо в хэдере.

здесь мы кстати, наблюдаем один из величайших косяков в дизайне языка:
если мы попросим адрес у такой константы, то...
о боже! все будет по прежнему работать, как часики.

дело в том, что разработчики компиляторов,
уже давным давно порешали и проблему выделения памяти под константу.
и проблему выделения памяти под статическую фундаментальную константу.

поэтому, нет никаких технических ограничений,
применить механизм автоматической аллокации статического объекта,
определенного в хэдэре.

то есть, они ещё давным давно могли позволить определять в хэдерах
не только фундаментальные константы,
но и любые другие объекты.

в настоящий же момент ограничение "только для фундаментальных констант"
снято только и только для шаблонов.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 13:19     Чем же макрос define так плох? #48
Цитата Сообщение от hoggy Посмотреть сообщение
что под константы не выделяется память,
если не используются их адреса.
Имхо, вы обсуждаете разные вещи с разных позиций. Т.к. если значение (не адрес) этой константы используется, она явно или косвенно попадет в сегмент данных или кода, что повлияет на размер объектного файла.
Цитата Сообщение от hoggy Посмотреть сообщение
но не требует этого для фундаментальных констант?
Интегральных, а не фундаментальных. Для неинтегральных типов нужно добавлять constexpr.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 13:45     Чем же макрос define так плох? #49
Из всего твоего большого текста я понял, что словом "константа" ты называешь "переменную с квалификатором const". Хотя LynXzp изначально поднимал вопрос о define и enum'ах. В общем классический для форумов вариант, когда спрашивают о том, как нарисовать зелёный круг, а отвечают про то, как варить суп, и при этом кастрюлю называют словом "паровоз"

Добавлено через 13 минут
Хотя вполне возможно, что это я неправильно понял фразу "А константы это издевательство, они же будут занимать память все вне зависимости от использования" и LynXzp тоже называет "константой" переменную с квалифиатором const. Тогда согласен - я неправильно понял вас обоих. Но здесь я руководствуюсь стандартным принципом - я всегда исхожу из того, что новичок может изъясняться корявым языком, но знающий человек обычно называет вещи своими именами

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Ушёл в игнор
В виду вышенаписанного удалил из игнора. Прошу прощения

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
А не о том, что используемые константы/массивы кушают память
Я тебе всего лишь продемонстрировал на конкретном примере, что нельзя делать никаких выводов, опираясь на размер результирующего бинарника. И конкретный пример вполне наглядно показывал - две программы с разным размером массива имеют одинаковый размер бинарника. Именно из-за выравнивания секций, о которых я писал ранее
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 14:01     Чем же макрос define так плох? #50
Цитата Сообщение от Tulosba Посмотреть сообщение
она явно или косвенно попадет в сегмент данных или кода, что повлияет на размер объектного файла.
нет, не попадет.

потому что формально она вообще не будет существовать,
пока вы не попросите её адрес.
Цитата Сообщение от Tulosba Посмотреть сообщение
Интегральных, а не фундаментальных.
нет, фундаментальных.

например,
float не является интегральным,
однако для него это так же срабатывает.

Цитата Сообщение от Evg Посмотреть сообщение
что словом "константа" ты называешь "переменную с квалификатором const"
Ага.
константой я называю объект рожденный константным.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 14:25     Чем же макрос define так плох? #51
Цитата Сообщение от hoggy Посмотреть сообщение
потому что формально она вообще не будет существовать,
C++
1
2
3
4
5
#include <cstdio>
 
int main() {
    printf( "%d\n", 42 );
}
Т.е. программа выводит число, и при этом оно нигде не хранится и ничего не занимает? Откуда же оно появляется на консоли?
Цитата Сообщение от hoggy Посмотреть сообщение
float не является интегральным,
однако для него это так же срабатывает.
Срабатывает что? Я рассматривал твой пример:
C++
1
2
3
4
struct example
{
    static const int value = 10; 
};
Если здесь будет не интегральный тип (например double), то нужно явно добавлять определение переменной или добавлять constexpr. Пример.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 14:30     Чем же макрос define так плох? #52
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. программа выводит число, и при этом оно нигде не хранится и ничего не занимает? Откуда же оно появляется на консоли?
ага.

компилятору пофигу:

C++
1
2
3
4
int main()
{
    cout<< 10;
}
или
C++
1
2
3
4
5
int main()
{
    const int v  = 10;
    cout<< v;
}


Цитата Сообщение от Tulosba Посмотреть сообщение
Срабатывает что? Я рассматривал твой пример:
замените мой пример на:

C++
1
2
3
4
struct example
{
    static const float value = 10.5f; 
};
получите тоже самое поведение.


замените на шаблон от T
и получите тоже самое поведение для T.
(правда синтаксис будет иным, но не суть)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 14:34     Чем же макрос define так плох? #53
Цитата Сообщение от hoggy Посмотреть сообщение
получите тоже самое поведение.
Я же ссылку привел. Ты не смотрел что ли?
Цитата Сообщение от hoggy Посмотреть сообщение
ага.
Ну, если "ага", то объясни из какого такого "ничто" берется это число. Я послушаю
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 14:40     Чем же макрос define так плох? #54
Цитата Сообщение от Tulosba Посмотреть сообщение
Я же ссылку привел. Ты не смотрел что ли?
она не открылась.

Цитата Сообщение от Tulosba Посмотреть сообщение
Ну, если "ага", то объясни из какого такого "ничто" берется это число. Я послушаю
не распарсил этот поток сознания.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 14:42     Чем же макрос define так плох? #55
Цитата Сообщение от hoggy Посмотреть сообщение
читаешь стандарт языка
Стандарт языка описывает поведение программы, а вовсе не способы, которыми компилятор добивается такого поведения

C++
const int a = 10;
int foo (void) { return a; }
Код
$ g++ t.cc -S
$ cat t.s
...
__Z3foov:
...
        movl    $10, %eax    <--- в точку "return a" компилятор подставил 10
...
        .section .rdata,"dr"
        .align 4
__ZL1a:
        .long   10   <--- но переменная никуда не делась
...
И лишь в режиме с оптимизациями компилятор удалит переменную "a" (т.к. все её использования были заменены на значение константы). Тот факт, что в точку "return a" компилятор подставил значение - это тоже оптимизация, просто у современных компиляторов даже в режиме без оптимизаций делаются некоторые точечные оптимизации, которые практически не увеличивают время компиляции

Можно копнуть дальше и подать этот же код на вход компилятора Си (переименовав t.cc в t.c). И мы увидим, что в этом случае даже в режиме с оптимизациями переменная НЕ была удалена. Почему так происходит? Да потому что эти два кода (один и тот же текст в режимах Си и Си++) НЕ эквивалентны. В режиме Си++ на глобальные переменные с квалификатором const неявно навешивается модификатор static. И эквивалентный код на Си должен выглядеть как

C
static const int a = 10;
int foo (void) { return a; }
Тогда мы увидим симметричный код и симметричное поведение компилятора (в режиме без оптимизаций переменная остаётся, с оптимизациями удаляется)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 14:47     Чем же макрос define так плох? #56
Цитата Сообщение от hoggy Посмотреть сообщение
она не открылась.
Цитата Сообщение от hoggy Посмотреть сообщение
не распарсил этот поток сознания.
Ну попробуй ещё раз почитать и ссылку понажимать, может поймешь. Если всё-таки не справишься за обозримое время, изложу подробнее.

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
И эквивалентный код на Си должен выглядеть как
Вот чего тут не стоит делать, так это сишный код приплетать. Всё-таки в разделе плюсов обсуждение идет.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 14:50     Чем же макрос define так плох? #57
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот чего тут не стоит делать, так это сишный код приплетать. Всё-таки в разделе плюсов обсуждение идет
Обсуждается не язык, а код, получаемый компилятором. И эквивалентные конструкции Си куда более очевидны для понимания того, как строится код
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 16:27     Чем же макрос define так плох? #58
Цитата Сообщение от Evg Посмотреть сообщение
Стандарт языка описывает поведение программы, а вовсе не способы, которыми компилятор добивается такого поведения
оке.

в дебаге компилятор может и не выпиливать промежуточные значения.


ну и?

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Обсуждается не язык, а код, получаемый компилятором.
обсуждается именно язык.

по стандарту компиляторы могут выполнять любые оптимиации,
которые не противоречат изначальной "лочической машине",
задаваемой пользотвалем в исходном тескте.

есть исключение - конструкторы копии, либо r-value конструкторы.
эти компилятор может оптимизировать невзирая на их возможные эффекты.

Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну попробуй ещё раз почитать и ссылку понажимать, может поймешь.
блиа:
Цитата Сообщение от hoggy Посмотреть сообщение
она не открылась.
сколько раз нужно тыкать, что бы понять?

Цитата Сообщение от Tulosba Посмотреть сообщение
Если всё-таки не справишься за обозримое время, изложу подробнее.
время пришло.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,131
Записей в блоге: 26
24.10.2015, 16:34     Чем же макрос define так плох? #59
Цитата Сообщение от hoggy Посмотреть сообщение
ну и?
А не надо делать выводов о том, где и как расходуется память, опираясь на стандарт языка и на какие-то высосанные из пальца доводы. Особенно если вдруг под микроконтроллер нет полноценного оптимизирующего компилятора

Цитата Сообщение от hoggy Посмотреть сообщение
по стандарту компиляторы могут выполнять любые оптимиации
Вот именно, что "могут", а тебя послушать, так они "обязаны", а не "могут"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2015, 16:50     Чем же макрос define так плох?
Еще ссылки по теме:

C++ Палиндромы. Плох ли мой код?
Чем так отличается язык с++ от других языков программирования C++
C++ #define sqr(a) (a)*(a) - зачем так много скобок?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
24.10.2015, 16:50     Чем же макрос define так плох? #60
Цитата Сообщение от Evg Посмотреть сообщение
А не надо делать выводов о том, где и как расходуется память, опираясь на стандарт языка и на какие-то высосанные из пальца доводы. Особенно если вдруг под микроконтроллер нет полноценного оптимизирующего компилятора
я и неделаю.
Цитата Сообщение от Evg Посмотреть сообщение
Вот именно, что "могут", а тебя послушать, так они "обязаны", а не "могут"
компиляторы пишут здравомыслщие люди.
1.
на каких нибудь микроволноффках особенно критично не делать избыточных объектов.

2.
мой пример кода выше написан согласно стандатру.
а из этого следует, что любой копилятор обязан уметь делать inline подстановку
по месту использования фундаментальной константы.

итого:
все топовые компиляторы умеют оптимизировать промежуточные значение.

компиляторы для микроволновок - и подавно это умеют.
Yandex
Объявления
24.10.2015, 16:50     Чем же макрос define так плох?
Ответ Создать тему

Метки
#define
Опции темы

Текущее время: 19:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru