变量模板的开销
Overhead of variable template
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
}
就二进制内存占用和运行时速度而言,使用它的开销是多少?
如果两者之间存在任何差异,我肯定会将此作为错误报告给编译器制造商:
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
被编译为普通函数,在运行时执行以确定结果。这在运行时有所不同。参见 here for a code listing。
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
}
就二进制内存占用和运行时速度而言,使用它的开销是多少?
如果两者之间存在任何差异,我肯定会将此作为错误报告给编译器制造商:
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
被编译为普通函数,在运行时执行以确定结果。这在运行时有所不同。参见 here for a code listing。