данные;
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
скомпилирована как нормальная функция и выполняется во время выполнения для определения результата. Это имеет значение во время выполнения. См. here for a code listing.
Как и другие шаблоны, он создаст отдельный объект для каждого экземпляра (другого типа) в памяти. Эффекты во время выполнения могут поступать только от доступа к этой памяти, но незначительны (если у вас были тысячи этих глобальных переменных, которые не входили бы в кеш, но часто использовались). – ftynse