Есть ли преимущества в использовании переменной constexpr, которая никогда не предназначена для использования в константном выражении? - PullRequest
1 голос
/ 07 марта 2019

Это дополнительный вопрос к этому.

Из одного из ответов в связанном вопросе имеет смысл, что цель объявления переменной как constexpr не состоит в том, чтобы действительно сообщить компилятору о возможности использования этой переменной в качестве константного выражения (хотя это является конечным поведением компилятора), а скорее для передачи другим программистам намерения , что переменная может использоваться в константном выражении. Мой вопрос заключается в том, есть ли какая-либо выгода, производительность или иное, чтобы объявить переменную как constexpr, если переменная не предназначена для использования в константном выражении (например, константа-член переменной класса, которая появляется только в неконстантных выражениях с другими неконстантными переменными-членами). Также предположим, что это не для встроенной системы.

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

Ответы [ 2 ]

1 голос
/ 07 марта 2019

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

Это вопрос мнения, но я прошу не согласиться.

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

Ключевым моментом, который я хочу подчеркнуть, является то, что «значение известно во время компиляции» является характеристикой переменной / данных. Эту характеристику лучше зафиксировать с помощью функции, предоставляемой языком. Единственное время, которое можно оправдать, не используя его, будет, если есть какие-либо побочные эффекты.

0 голосов
/ 07 марта 2019

Да, переменные constexpr полезны не только для передачи намерения и использования в других константных выражениях.

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

constexpr int constexpr_function() { return 123; }
int expensive_runtime_function() { return 123; }

void f()
{
    constexpr int good1 = constexpr_function(); // OK.
    // constexpr int good2 = expensive_runtime_function(); // Good: error.

    const int bad1 = constexpr_function(); // OK.
    const int bad2 = expensive_runtime_function(); // Bad: unexpected runtime cost.
}
...