考虑以下代码:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
通过以下Bash命令(使用g ++ 8.3.0)通过g ++对其编译进行基准测试时
for ((level=1; level<30; ++level)); do
echo -n ${level},
/usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null
done
我得到以下输出:
1,0.03
2,0.03
3,0.04
4,0.04
5,0.04
6,0.04
7,0.04
8,0.04
9,0.03
10,0.04
11,0.02
12,0.04
13,0.02
14,0.03
15,0.04
16,0.05
17,0.05
18,0.08
19,0.11
20,0.20
21,0.35
22,0.67
23,1.30
24,2.52
25,5.02
26,10.23
27,19.96
28,40.30
29,80.99
因此,编译时间在LEVEL
中是指数的。但是如果我将B x, y;
更改为B x[2];
,则编译将在恒定时间(〜30毫秒)中进行。
为什么会发生?我以为,由于编译器知道B
是x
和y
的同一类型,因此与编译x[2]
所需的时间相同。但是由于某种原因,它似乎有所不同。
我能以某种方式强制实现B
(而不是简单的别名),以便g ++可以像创建数组一样容易地创建两个变量吗?
答案 0 :(得分:1)
因为您的g ++实例中存在错误。不应这样做,正如@Marc Glisse所评论的那样,您应该报告它(在撰写本文时已完成)
您可能想要删除您的问题。