【问题标题】:Why does this code take so long to compile with g++?为什么这段代码用 g++ 编译需要这么长时间?
【发布时间】:2020-02-02 14:26:35
【问题描述】:

考虑以下代码:

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 ms)进行。

为什么会这样?我想,因为编译器知道Bxy 的同一个类型,所以编译x[2] 需要相同的时间。但由于某种原因,它看起来不同。 我能否以某种方式强制实现 B(而不是简单地使用别名),以便 g++ 可以像创建数组一样轻松地创建这两个变量?

【问题讨论】:

  • 技术上正确但无用(对您而言)的答案:修补编译器。
  • 你为什么要在这里发布? Gcc 有一个用于报告问题的 bugzilla...不过,请确保先使用最新版本进行测试。
  • @MarcGlisse 我希望有一个很好的解释或解决方法。不确定如果我这样报告它是否会被认为是值得尝试修复的错误。
  • 他们甚至有一个关键字“compile-time-hog”用于编译器编译时间过长的情况,所以是的,他们认为值得修复(这并不意味着他们会立即这样做) .因此,特别是如果您看到另一个没有指数行为的编译器(所以您知道这是可以避免的),请报告它。好吧,也许检查一下你是否在数据库中看到任何非常相似的东西,但如果你错过了一个不明显的重复,那也没关系。

标签: c++ templates gcc compilation


【解决方案1】:

因为您的 g++ 实例中存在错误。它不应该,正如@Marc Glisse 评论的那样,您应该报告它(您在撰写本文时已经这样做了)

你可能想删除你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2012-12-28
    • 2019-11-15
    相关资源
    最近更新 更多