Оценка предложения if во время компиляции - PullRequest
4 голосов
/ 27 сентября 2019

Рассмотрим следующий фрагмент кода:

#include <limits>
#include <stdexcept>

void g(unsigned) {
    // ...
}

template<typename UIntT>
void f(UIntT n)
{
    if constexpr (std::numeric_limits<UIntT>::max() > std::numeric_limits<unsigned>::max())
    {
        if (n > std::numeric_limits<unsigned>::max())
            throw std::length_error("Too long.");
    }

    g(n);
}

Интересно, действительно ли здесь полезно предложение if constexpr?Разве компиляторы не достаточно умны, чтобы выяснить, может ли предложение 'if' быть когда-либо истинным для данного UIntT?Если да, то это предписано стандартом?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Не достаточно умны компиляторы, чтобы выяснить, может ли когда-либо быть верным условие if для данного UIntT?

Большинство из них.

Если это так, предписано ли это стандартом?

Нет, некоторым оптимизациям присвоено имя (RVO: s и т. Д.), Которые впоследствии были включены в языковой стандарт, но DEADC0DE оптимизации не стандартизированы (насколько мне известно).

... но constexpr - это

Там нет способа соответствующий компилятор сохранит этот блок (еслив полученном двоичном файле условие false) - однако вы решили оптимизировать свой код.

1 голос
/ 28 сентября 2019

Это использование if constexpr не имеет заметных отличий от if в соответствии со стандартом C ++.

Однако, несколько отличающиеся его варианты могут привести к заметной разнице в том, какие символы использует единица компиляции,Мне кажется вероятным, что это приведет к заметным различиям.

Большинство современных компиляторов могут и будут уменьшать это значение до if (false) во время оптимизации, даже если не constexpr, и устранение мертвых ветвей - довольно простая оптимизация.В отладочной сборке они могут оставить мертвый код в покое, в то время как они могут устранить его с помощью constexpr.

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

...