C++ 变量模板的开销
C++14引入了变量模板()C++ 变量模板的开销,c++,c++14,variable-templates,C++,C++14,Variable Templates,C++14引入了变量模板() 模板 constexpr T pi=T(3.1415926535897932385);//可变模板 模板 T圆形_区域(tr)//函数模板 { 返回pi*r*r;//pi是一个变量模板实例化 } 从二进制内存占用和运行速度两方面来看,使用这种方法的开销是多少?如果以下两种方法之间存在任何差异,我肯定会将其作为错误报告给编译器制造商: template<class T> constexpr T pi = T(3.1415926535897932385);
模板
constexpr T pi=T(3.1415926535897932385);//可变模板
模板
T圆形_区域(tr)//函数模板
{
返回pi*r*r;//pi是一个变量模板实例化
}
从二进制内存占用和运行速度两方面来看,使用这种方法的开销是多少?如果以下两种方法之间存在任何差异,我肯定会将其作为错误报告给编译器制造商:
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
}
如果将double
替换为float
,则情况相同
通常,
constexpr
应直接在编译代码中计算为相关常数。如果它不能做到这一点,那么编译器应该给出一个错误(因为它不是真的constepr
)。如果以下两者之间存在任何差异,我肯定会将此作为错误报告给编译器制造商:
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
}
如果将double
替换为float
,则情况相同
通常,constexpr
应直接在编译代码中计算为相关常数。如果它不能这样做,那么编译器应该给出一个错误(因为它不是真的constexpr
)。给定
template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;
给定constexpr
函数circular\u area\u 1
和模板函数circular\u area\u t
,这两个函数都会在编译时计算结果,因此是二进制文本。非constepr
函数circular\u area\u 2
作为正常函数编译,并在运行时执行以确定结果。这在运行时会有所不同。参见。给出的
template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;
给定
constexpr
函数circular\u area\u 1
和模板函数circular\u area\u t
,这两个函数都会在编译时计算结果,因此是二进制文本。非constepr
函数circular\u area\u 2
作为正常函数编译,并在运行时执行以确定结果。这在运行时会有所不同。请参阅。与其他模板一样,它将为内存中的每个实例化(不同类型)创建一个单独的对象。对运行时的影响可能只来自访问该内存,但可以忽略不计(如果您有数千个这样的全局变量,它们不适合缓存,但经常使用)。与其他模板一样,它将为内存中的每个实例化(不同类型)创建一个单独的对象。对运行时的影响可能只来自访问该内存,但可以忽略不计(如果您有数千个这样的全局变量,它们不适合缓存,但经常使用)。
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;
}