Re[10]: constexpr - разочарование
От: N. I.  
Дата: 14.06.17 19:00
Оценка: 11 (3)
Дрободан Фрилич:

ДФ>Конкретный пример, один компилятор проверяет все ветки на соответствие 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-ом году. Соответственно, компиляторы, которые этому правилу не следуют, либо какие-то реально олдскульные, либо просто забагованные по данной части.
Отредактировано 14.06.2017 19:40 N. I. . Предыдущая версия .
Re: constexpr - разочарование
От: tstalker Украина  
Дата: 16.06.17 13:37
Оценка: -1
Здравствуйте, Дрободан Фрилич, Вы писали:

ДФ>Игрался с констэкспрами.

ДФ>И VC , и G++ генерят обычные вызовы даже в релизе.
ДФ>Вычисления в compile time производятся только если компилятор припереть к стенке,
ДФ>Это нормально?

Произошла типичная подмена понятий.
Добро победит в отдалённой перспективе.
А пока бери, сынок, шашку и рубай всю эту сволочь направо и налево!

(Ц) Гоблин. Властелин колец

Вот пример вычисления факториала:
#include <iostream>

using ull = unsigned long long;
using cull = const ull;

constexpr ull fact(cull x)
{
    return x ? x * fact(x - 1) : 1;
}

int main()
{
    std::cout << fact(5) << std::endl;
}

С опцией -Ofast вместо вызова функции подставляется число 120.
Без данной опции генерится вызов функции.

Ваш К.О.
Re[2]: constexpr - разочарование
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.06.17 13:45
Оценка:
Здравствуйте, tstalker, Вы писали:

T>С опцией -Ofast вместо вызова функции подставляется число 120.


откуда вы все это берете? %)
с опцией -O1/-O2/-O3 — результат тот же:
https://godbolt.org/g/JE84QB

в вашем же примере меняю -Ofast на -O1 — результат тот же.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 16.06.2017 13:47 niXman . Предыдущая версия .
Re[3]: constexpr - разочарование
От: tstalker Украина  
Дата: 16.06.17 14:14
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, tstalker, Вы писали:


T>>С опцией -Ofast вместо вызова функции подставляется число 120.


X>откуда вы все это берете? %)

X>с опцией -O1/-O2/-O3 — результат тот же:
X>https://godbolt.org/g/JE84QB

X>в вашем же примере меняю -Ofast на -O1 — результат тот же.


Ok, для тех, кто в танке:

С включенной оптимизацией вместо вызова функции подставляется число.
Без оптимизации генерится вызов функции.

Так яснее?
Re[4]: constexpr - разочарование
От: niXman Ниоткуда https://github.com/niXman
Дата: 16.06.17 14:19
Оценка:
Здравствуйте, tstalker, Вы писали:

T>Ok, для тех, кто в танке:

т.е. для вас.

цитирую:

1. С опцией -Ofast вместо вызова функции подставляется число 120.
2. Без данной опции генерится вызов функции.

два момента:
1. без опции -Ofast, но с опциями -O1/-O2/-O3 — так же подставляется число.
2. без -Ofast, но с опциями -O1/-O2/-O3 — не генерится вызов функции.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: constexpr - разочарование
От: Дрободан Фрилич СССР  
Дата: 16.06.17 14:28
Оценка:
tstalker:

T>С опцией -Ofast вместо вызова функции подставляется число 120.

T>Без данной опции генерится вызов функции.

T>Ваш К.О.

Товарищ капитан подоспел когда вопрос уже прояснен.
Re[2]: constexpr - разочарование
От: N. I.  
Дата: 16.06.17 16:12
Оценка:
tstalker:

T>С опцией -Ofast вместо вызова функции подставляется число 120.

T>Без данной опции генерится вызов функции.

При соответствующей игре с ключиками получить такую оптимизацию можно и на каком-нибудь старом GCC 4.4.7, в котором поддержки constexpr функций вообще нет: https://godbolt.org/g/aMrDgN
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.