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
}

就二进制内存占用和运行时的速度而言,使用它的开销是多少?

4

2 回答 2

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

如果你doublefloat.

一般来说,constexpr应该直接在编译后的代码中计算相关常量。如果它不能这样做,那么编译器应该给出一个错误(因为它不是一个 true constexpr)。

于 2016-02-29T08:40:48.323 回答
0

给定;

template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;

没有运行时差异,它们都是编译时常量。模板是编译时的事情 - 因此,当比较 like 与 like(即constexpr double pivs. 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;
}

给定constexprfunctioncircular_area_1和 template function circular_area_t,这两者都会导致编译时计算,因此结果是二进制中的文字。非constexpr函数circular_area_2被编译为普通函数,并在运行时执行以确定结果。这在运行时会有所不同。请参阅此处获取代码清单

于 2016-03-02T10:38:30.613 回答