Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量模板的开销_C++_C++14_Variable Templates - Fatal编程技术网

C++ 变量模板的开销

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

C++14引入了变量模板()

模板
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;
}