我有一个自动生成的 C++ 源文件,大小约为 40 MB。它主要由一些向量的 push_back 命令和应该推送的字符串常量组成。
当我尝试编译这个文件时,g++ 退出并说它无法保留足够的虚拟内存(大约 3 GB)。谷歌搜索这个问题,我发现使用命令行开关
--param ggc-min-expand=0 --param ggc-min-heapsize=4096
可以解决问题。但是,它们似乎仅在打开优化时才起作用。
1)这真的是我正在寻找的解决方案吗?
2)或者是否有更快,更好(编译需要很长时间并激活这些选项)的方法来做到这一点?
最好的祝愿,
亚历山大
更新:感谢所有好主意。我尝试了其中的大多数。使用数组而不是几个 push_back() 操作减少了内存使用量,但由于我试图编译的文件太大,它仍然崩溃,只是后来才崩溃。在某种程度上,这种行为真的很有趣,因为在这样的设置中没有太多需要优化的地方——GCC 在幕后做了什么来消耗这么多内存?(我也通过停用所有优化进行编译并得到相同的结果)
我现在切换到的解决方案是从我使用原始文件创建的二进制对象文件中读取原始数据objcopy
。这是我最初不想做的,因为用高级语言(在本例中为 Perl)创建数据结构比用 C++ 更方便。
但是,在 Win32 下运行它比预期的要复杂。objcopy 好像生成ELF格式的文件,手动设置输出格式为pe-i386
. 目标文件中的符号按照文件名的标准命名,例如转换文件inbuilt_training_data.bin
将产生这两个符号:binary_inbuilt_training_data_bin_start 和 binary_inbuilt_training_data_bin_end。我在网上找到了一些教程,声称这些符号应该声明为extern char _binary_inbuilt_training_data_bin_start;
,但这似乎不对——只extern char binary_inbuilt_training_data_bin_start;
对我有用。