为什么这段代码需要这么长时间才能用 g++ 编译?
Why does this code take so long to compile with g++?
请考虑以下代码:
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++ 可以像创建数组一样轻松地创建这两个变量?
因为您的 g++ 实例中存在错误。它不应该,正如@Marc Glisse评论的那样,你应该报告它(在撰写本文时你已经这样做了(
然后你可能想删除你的问题。
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- SFML RenderWindow打开窗口需要很长时间
- Kafka C++客户端需要很长时间才能收到消息
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- asio::read() 需要很长时间,使用 asio::write 没有问题
- 将线程锁定很长时间
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 即使长时间等待,C++线程也不会加入
- 连接() 在连接被拒绝时长时间挂起
- 为什么这段代码需要这么长时间才能用 g++ 编译?
- 如何在长时间运行的方法中等待信号?
- mbed 套接字连接需要很长时间
- Lambda 捕获此函数和长时间运行的函数
- std::fstream 需要很长时间才能将大数据写入.csv文件中
- 为什么与Java和Python相比,使用Cmake运行C++程序每次都需要这么长时间?
- 需要很长时间
- 在关闭应用程序期间正确关闭线程,该线程可能会运行很长时间的循环
- 如何在长时间计算中进行C 的一次进度更新
- gai_cancel() 需要很长时间才能成功
- 您怎么知道长时间的长度