Когда следует использовать возможность constexpr в C ++ 11? - PullRequest
312 голосов
/ 20 января 2011

Мне кажется, что наличие «функции, которая всегда возвращает 5» нарушает или ослабляет значение «вызова функции».Должна быть причина, или необходимость в этой возможности, иначе ее не будет в C ++ 11.Почему это там?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }

Мне кажется, что если бы я написал функцию, возвращающую буквальное значение, и пришел к обзору кода, кто-то сказал бы мне, а затем объявить постоянное значение вместописьменный возврат 5.

Ответы [ 14 ]

1 голос
/ 20 января 2011

Ваш основной пример служит тем же аргументом, что и аргумент самих констант. Зачем использовать

static const int x = 5;
int arr[x];

над

int arr[5];

Потому что это намного удобнее в обслуживании. Использование constexpr намного, намного быстрее для записи и чтения, чем существующие методы метапрограммирования.

0 голосов
/ 13 июня 2019

Когда использовать constexpr:

  1. всякий раз, когда есть постоянная времени компиляции.
0 голосов
/ 20 января 2011

Может включить некоторые новые оптимизации.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 является более надежной гарантией того, что возвращаемое значение не изменится.

0 голосов
/ 20 января 2011

Это полезно для чего-то вроде

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }

int some_arr[MeaningOfLife()];

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

...