c++ - 为什么这段代码用 g++ 编译需要这么长时间?

标签 c++ templates gcc compilation

考虑以下代码:

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两者都是同一种类型 xy ,它需要与编译 x[2] 相同的时间.但由于某种原因,它看起来不同。
我可以以某种方式强制B要实现(而不是简单的别名),以便 g++ 可以像创建数组一样轻松地创建这两个变量?

最佳答案

因为您的 g++ 实例中存在错误。它不应该,正如@Marc Glisse 评论的那样,您应该报告它(您在撰写本文时已完成)
那么你可能想删除你的问题。

关于c++ - 为什么这段代码用 g++ 编译需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58233174/

相关文章:

c++ - C++ 中的回调,模板成员?

c - 如何在 C 中为外部定义的函数创建别名?

gcc - 关于 gcc 生成的汇编代码(汇编代码不按顺序排列?)

c++ - 在 Qt 中的窗体之间传输数据

c++继承自专门的模板类

c++ - 模板化需求表达式

c++ - gcc MinGW 上的 InterlockedOr8

c++ - 一行 std::vector ctor 映射另一个 vector ?

python - "Deterministic"伪随机数生成

c++ - 如何使用 WAF 链接静态库?