我正在尝试编译一个 5.7 MB 大的 C++ 文件。我正在 64 位 Linux 系统上构建一个 64 位 Linux 可执行文件。不幸的是,g++ 4.7.2 不合作:
g++: internal compiler error: Killed (program cc1plus)
观察top
表明该过程在此之前达到了大约 2.2 gigs 的内存。我尝试设置--param gcc-min-expand=0
并玩过,--param gcc-min-heapsize
但这并没有解决问题。禁用优化-O0
也没有帮助。
我也试过用clang编译,但结果是相似的。它在超过 2 gigs 的内存后也出现了段错误。我没有尝试使用 clang 的任何额外选项,因为我对它不太熟悉。
有问题的源文件包含几个映射的 C++11 样式初始化。
typedef std::map<std::string, int> StringToIntMap;
StringToIntMap someData = {{"SOMESTRING", 1}, ..};
我想要的是最好用 gcc 编译文件,尽管如果 clang 可以代替,我也可以忍受它。从了解内部情况的人那里了解幕后发生的事情也很有帮助。如果我有一个包含 300 000 个元素的映射,其中字符串大约 5 个字节长,并且int
每个元素对应一个,那就是几兆字节的数据,我无法轻易想象初始化程序如何将它炸到需要千兆字节的地步编译。
并抢占我不应该有这么大的源文件的评论。我知道我可以在运行时从数据文件中读取数据,这就是程序现在所做的,但我的用例是程序的执行时间是最重要的因素。