Может включить некоторые новые оптимизации.const
традиционно является подсказкой для системы типов и не может использоваться для оптимизации (например, const
функция-член может const_cast
и в любом случае легально изменить объект, поэтому const
нельзя доверять для оптимизации).
constexpr
означает, что выражение действительно является константой, если входные данные для функции постоянны.Обратите внимание:
class MyInterface {
public:
int GetNumber() const = 0;
};
Если это раскрыто в каком-то другом модуле, компилятор не может поверить, что GetNumber()
не будет возвращать разные значения при каждом вызове - даже последовательно без неконстантных вызовов вмежду - потому что const
мог быть отброшен в реализации.(Очевидно, что любой программист, который сделал это, должен быть застрелен, но язык разрешает это, поэтому компилятор должен соблюдать правила.)
Добавление constexpr
:
class MyInterface {
public:
constexpr int GetNumber() const = 0;
};
КомпиляторТеперь можно применить оптимизацию, когда возвращаемое значение GetNumber()
кэшируется, и исключает дополнительные вызовы GetNumber()
, поскольку constexpr
является более надежной гарантией того, что возвращаемое значение не изменится.