C ++ 14 представил шаблоны переменных (Шаблоны переменных).
template<class T>
constexpr T pi = T(3.1415926535897932385); // variable template
template<class T>
T circular_area(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}
Каковы издержки использования этого, как с точки зрения объема двоичной памяти и скорости во время выполнения?
Я определенно сообщу об этом как об ошибке производителю компилятора, если есть ЛЮБОЕ различие между:
template<class T>
constexpr T pi = T(3.1415926535897932385); // variable template
template<class T>
T circular_area(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}
а также
constexpr double pi = 3.1415926535897932385;
double circular_area(double r)
{
return pi * r * r;
}
И то же самое, если вы замените double
с float
,
В общем, constexpr
следует оценивать до соответствующей константы прямо в скомпилированном коде. Если он не может этого сделать, то компилятор должен выдать ошибку (потому что это не правда constexpr
).
Дано;
template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;
Разницы во времени выполнения нет, они обе являются константами времени компиляции. Шаблоны — вещь времени компиляции — как таковая, когда сравнивается как с подобным (т.е. constexpr double pi
против constexpr T pi
) это закончилось бы тем же самым — это ожидается.
Что отличается от кода OP, так это то, как он используется.
template<class T>
T circular_area_t(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}
// and
constexpr double circular_area_1(double r)
{
return pi<double> * r * r;
}
double circular_area_2(double r)
{
return pi<double> * r * r;
}
Учитывая constexpr
функция circular_area_1
и функция шаблона circular_area_t
, оба из них приводят к вычислениям времени компиляции, следовательно, литералы в двоичном коде результата. Затем на-constexpr
функция circular_area_2
компилируется как обычная функция и выполняется во время выполнения для определения результата. Это имеет значение во время выполнения. Увидеть здесь для перечисления кода.