我在一本关于元编程的书中找到了这个工作代码 -
template<unsigned long N>
struct binary
{
static unsigned const value = binary<N/10>::value *2 + N%10;
};
template<>
struct binary<0>
{
static unsigned const value = 0;
};
int main()
{
unsigned x = binary<101010>::value;
cout << x;
}
我的问题是 - 分配了value
的内存在哪里?是否在数据段上分配?
此外,该书还说这段代码导致了一系列模板实例化,它们以类似于递归的方式计算结果。这是否意味着每个模板实例化,在数据段上分配了新的unsigned
?
答案 0 :(得分:6)
value
没有定义。此类静态数据成员只能以不要求它们具有地址的方式使用(它们不能 odr-used )。他们的值将被内联,就好像你有unsigned x = 42;
。
当然编译器必须以某种方式实例化所有模板特化并计算binary<101010>::value
。但是编译完成后再也没关系了。
答案 1 :(得分:3)
如果使用优秀的C ++编译器,则不会在任何地方分配内存。 C ++编译器将完全优化掉这个类,并在任何使用它的代码中直接使用计算出的常量。