exponenta event banner

Отсутствует спецификатор constexpr

constexpr спецификатор может использоваться в выражении для вычисления времени компиляции

Описание

Этот дефект возникает, если опустить constexpr спецификатор, когда переменная инициализируется с помощью выражения, которое может быть вычислено во время компиляции.

Средство проверки дефектов помечает определение локальной переменной без constexpr спецификатор, если переменная инициализируется одним из следующих элементов и впоследствии не изменяется в коде:

  • Константа времени компиляции, например, литеральное значение.

  • Выражение, включающее только константы времени компиляции.

  • Вызов функции с константами времени компиляции в качестве параметров при условии, что функция сама по себе constexpr или функция содержит только оператор return, включающий его параметры.

  • Вызов конструктора с константой времени компиляции при условии, что все функции-члены класса, включая конструктор, сами по себе constexpr.

Средство проверки не помечает локальные статические переменные.

Риск

Если значение переменной вычисляется из выражения, которое включает только константы времени компиляции, используйте constexpr перед определением переменной, например:

constexpr double eValSquared = 2.718*2.718;
гарантирует, что выражение вычисляется во время компиляции. Оценка времени компиляции позволяет сэкономить на накладных расходах во время выполнения. Иногда прирост производительности во время выполнения может быть значительным.

Если выражение не может быть вычислено во время компиляции, constexpr ключевое слово обеспечивает получение ошибки компиляции. Затем можно устранить основную проблему, если это возможно.

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

Зафиксировать

Добавить constexpr спецификатор для определения переменной.

Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.

Примеры

развернуть все

double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    double eVal = 2.718; 
    double eValSquare = squareIfPositive(2.718);
    const double eValCubed = 2.718 * 2.718 * 2.718;
}

В этом примере средство проверки помечает три определения переменных в initialize потому что переменные инициализируются выражениями, включающими литеральные значения и constexpr ключевое слово опущено.

Исправление - Добавить constexpr Спецификатор
constexpr double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    constexpr double eVal = 2.718; 
    constexpr double eValSquare = squareIfPositive(2.718);
    constexpr double eValCubed = 2.718 * 2.718 * 2.718;
}

Добавить constexpr спецификатор для определений переменных. Чтобы избежать ошибок времени компиляции, убедитесь, что функция squareIfPositive, которая возвращает значение constexpr переменная, сама по себе constexpr.

Информация о результатах

Группа: Производительность
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: MISSING_CONSTEXPR
Воздействие: среднее
Представлен в R2020b