为什么gcc会花费17分钟以上的时间来编译std :: array <std :: string,65536 =“”>?

时间:2019-05-30 10:19:32

标签: c++ gcc stdarray

为什么<?php $query = "INSERT INTO products(name, price, type, des, img)VALUES('".$name."', '".$price."', '".$type."', '".$des."', '".$img."')"; ?> 在Core i7 9700K处理器上使用-O3进行gcc编译需要花费超过17分钟的时间?

我偶然发现了gcc的问题,我在头文件中用std::array<std::string, 65536> a = {};空初始化了一个std::array,而不是在源文件的专用构造函数中进行了初始化。该文件包含在多个位置,这导致了几乎无限的优化循环。使用std::string时,它迅速完成,但是使用-O0,我在核心i7-9700K处理器上等待了一个多小时,而gcc仍在运行。

我最终将问题缩小为-O1的空初始化,其中std::array<std::string, N>是一个很大的数字。对于其他类型的其他非平凡构造函数,在编译时间随元素数量线性增加的情况下,也可能会遇到类似的问题。像下面的示例。

N

为了弄清楚这个问题,我将上面的代码编译为汇编代码。使用#include <array> struct A { A() : i(0) {} int i; }; int main() { std::array<A, 65536> a = {}; return 0; } 时,程序集看起来像是展开的-O0调用构造函数的循环,其行数约为数组大小的4倍。启用优化功能时,似乎一并消除了初始化。

for

当用#include <array> #include <string> int main() { std::array<std::string, 65536> a = {}; return 0; } 替换数组的内容时,即使启用了优化,编译器似乎也无法删除std::string的初始化。

我想这是为什么我的初始构建陷入无尽的优化循环的原因的一部分,但是它并不能完全解释它,也不是为什么clang似乎能更好地处理这一问题。有没有人可以进一步阐明这个问题?

我尝试了几种gcc版本,从gcc-6到gcc-8。即使使用gcc-4.9,也需要花费一些时间,但花费的时间并不多,大约需要4.5分钟。将clang与-stdlib = libstdc ++一起使用时,编译时间为0m0,120s。

0 个答案:

没有答案