为什么使用g++编译此代码需要如此长的时间?

12

请考虑以下代码:

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)来对其编译进行基准测试:

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毫秒)。

为什么会这样呢?我以为,由于编译器知道Bxy的相同类型,它将花费与编译x[2]相同的时间。但出于某种原因似乎不同。 我能否以某种方式强制实现B(而不仅仅是创建别名),以便g ++可以像创建数组一样轻松地创建两个变量?


1
一个技术上正确但对你没用的答案:修补编译器。 - Botje
5
你为什么要在这里发布那个?GCC有一个Bugzilla用于报告问题...不过请确保首先使用最新版本进行测试。 - Marc Glisse
@MarcGlisse,我希望有一个好的解释或解决方法。如果我报告这个问题,不确定它是否被认为是值得尝试修复的错误。 - Ruslan
3
他们甚至有一个关键词“compile-time-hog”来描述编译器编译速度过慢的情况,所以他们认为这值得修复(但这并不意味着他们会立即处理)。因此,如果你能看到另一个编译器没有指数级行为(这样你就知道可以避免),请报告它。也许在数据库中检查是否有非常相似的内容,但如果你错过了一个不明显的重复内容也没关系。 - Marc Glisse
5
@MarcGlisse 报告说:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91990 - Ruslan
显示剩余4条评论
1个回答

1
因为您的g++实例存在一个bug。正如@Marc Glisse所评论的那样,它不应该这样,您应该报告它(在撰写本文时已经报告了)。
您可能想要删除您的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接