Дрободан Фрилич:
ДФ>Конкретный пример, один компилятор проверяет все ветки на соответствие constexpr-у, а другой только те что вычисляются.
По правилам C++11/14/17 невычисляющиеся подвыражения на константность всего выражения не влияют:
С++11:
A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression (3.2), but subexpressions of logical AND (5.14), logical OR (5.15), and conditional (5.16) operations that are not evaluated are not considered [ Note: An overloaded operator invokes a function.—end note ]:
C++14/17:
A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:
Формулировка касательно игнорирования невычисляющихся подвыражений появилась в 4-й ревизии proposal-а по Generalized Constant Expressions N2116 (2006 г.) и вошла в черновик C++0x N2369 в 2007-ом году. Соответственно, компиляторы, которые этому правилу не следуют, либо какие-то реально олдскульные, либо просто забагованные по данной части.
Здравствуйте, Дрободан Фрилич, Вы писали:
ДФ>Игрался с констэкспрами. ДФ>И VC , и G++ генерят обычные вызовы даже в релизе. ДФ>Вычисления в compile time производятся только если компилятор припереть к стенке, ДФ>Это нормально?
Произошла типичная подмена понятий.
Добро победит в отдалённой перспективе.
А пока бери, сынок, шашку и рубай всю эту сволочь направо и налево!
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, tstalker, Вы писали:
T>>С опцией -Ofast вместо вызова функции подставляется число 120.
X>откуда вы все это берете? %) X>с опцией -O1/-O2/-O3 — результат тот же: X>https://godbolt.org/g/JE84QB
X>в вашем же примере меняю -Ofast на -O1 — результат тот же.
Ok, для тех, кто в танке:
С включенной оптимизацией вместо вызова функции подставляется число.
Без оптимизации генерится вызов функции.
Здравствуйте, tstalker, Вы писали:
T>Ok, для тех, кто в танке:
т.е. для вас.
цитирую:
1. С опцией -Ofast вместо вызова функции подставляется число 120.
2. Без данной опции генерится вызов функции.
два момента:
1. без опции -Ofast, но с опциями -O1/-O2/-O3 — так же подставляется число.
2. без -Ofast, но с опциями -O1/-O2/-O3 — не генерится вызов функции.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
tstalker:
T>С опцией -Ofast вместо вызова функции подставляется число 120. T>Без данной опции генерится вызов функции.
T>Ваш К.О.
Товарищ капитан подоспел когда вопрос уже прояснен.
tstalker:
T>С опцией -Ofast вместо вызова функции подставляется число 120. T>Без данной опции генерится вызов функции.
При соответствующей игре с ключиками получить такую оптимизацию можно и на каком-нибудь старом GCC 4.4.7, в котором поддержки constexpr функций вообще нет: https://godbolt.org/g/aMrDgN