【发布时间】:2010-12-21 11:48:27
【问题描述】:
我有一个自动生成的 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; 对我有用。
【问题讨论】:
-
这属于 thedailywtf.com。
-
为了更好地帮助您,请发布您拥有自动生成的 C++ 源文件的原因以及您正在编译的目标(即:可执行文件、库等)。
-
我们应该让他发布代码吗,兄弟们? :-)
-
我知道 Markdown JavaScript 在我输入几 KB 后开始占用我的 CPU;我想 40 MB 会给我一个旋转的死亡彩虹。
标签: gcc g++ compilation large-files