考虑以下代码:
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 ++可以像创建数组一样容易地创建两个变量吗?
1
一个技术上正确但无用(对您而言)的答案:对编译器进行修补。
—
Botje
你为什么要在这里发布?Gcc有一个bugzilla用于报告问题...不过,请确保先测试最新版本。
—
马克·格里斯
@MarcGlisse我希望可能会有一个很好的解释或解决方法。不知道如果我这样报告,是否将其视为值得尝试修复的错误。
—
罗斯兰
对于编译器花费太长时间进行编译的情况,他们甚至有一个关键字“ compile-time-hog”,因此,是的,他们认为值得修复(这并不意味着他们会立即这样做)。因此,尤其是如果您看到另一个没有指数行为的编译器(因此可以避免),请报告。好吧,也许检查一下您是否在数据库中看到任何非常相似的东西,但是如果您错过了一个非显而易见的重复也可以。
—
马克·格里斯
@MarcGlisse报告:gcc.gnu.org/bugzilla/show_bug.cgi?
—
Ruslan