2016-02-29 2 views
1

C++ 14 введенные переменные шаблоны (Variable templates).Накладные расходы переменного шаблона

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 
} 

Каковы накладные расходы при использовании этого, как с точки зрения двоичной памяти, так и скорости во время выполнения?

+1

Как и другие шаблоны, он создаст отдельный объект для каждого экземпляра (другого типа) в памяти. Эффекты во время выполнения могут поступать только от доступа к этой памяти, но незначительны (если у вас были тысячи этих глобальных переменных, которые не входили бы в кеш, но часто использовались). – ftynse

ответ

5

Я определенно сообщить об этом как об ошибке производителя компилятора, если есть какая-то разница между:

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).

0

данные;

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, оба эти результата в компиляции расчетов времени, следовательно, литералов в двоичной, результата. Функция constexprcircular_area_2 скомпилирована как нормальная функция и выполняется во время выполнения для определения результата. Это имеет значение во время выполнения. См. here for a code listing.

Смежные вопросы