gex*_*ide 5 c++ linker templates c++11
我正在使用 C++ 进行一个大学研究项目,其中包含许多模板,这些模板具有进一步的嵌套模板等。该项目是关于特定研究领域的高效索引数据结构。你可以想象:一个索引结构有很多参数需要调整,所以我们过度使用模板参数。当然,我们想用不同的参数集来测试我们的索引,所以有相当多的模板实例。
这个项目并没有那么大。也许 50k LOC。但是,链接仍然需要 50 秒并消耗超过 7 GB 的内存 (!!!)。我在一个 32GB 的工作站上,所以对我来说一切都很好。我经常有学士和硕士学生在做这个项目。问题是它们通常在具有 4 GB 或 8 GB RAM 的笔记本电脑上工作。因此,这些学生在编译该项目时遇到了很大的麻烦。生成的测试二进制文件(即只包含索引结构单元测试的二进制文件)为 700 兆字节。其中大部分是符号,因为嵌套模板会产生巨大的名称。如果我strip在二进制文件上使用,它会降到 8 兆字节。
那么有没有办法减少链接过程中的RAM使用量?即使使用嵌套模板,有没有办法让符号更小?
我们std=c++11在 Ubuntu 14.10 下使用 g++4.9 进行编译。
编辑:
它似乎真的是嵌套模板。我们有两个带有非常深的嵌套模板的测试用例。.o这些测试的两个文件几乎占最终二进制文件内存的 90%。它们导致方法名称超过 3000 个字符。这里没有办法不使用嵌套模板,因为它们形成了示例查询的“处理树”。使用深度嵌套的模板时,有什么方法可以使名称保持简短?
GCC 对于它使用的 RAM 有一个垃圾收集方案。
参数ggc-min-expand和ggc-min-heapsize用于确定 GCC 何时应清理和释放其未使用的内存(它们的默认值是总系统内存的百分比)。
你可以尝试这样的事情:
g++ --param ggc-min-expand=0 --param ggc-min-heapsize=8192
Run Code Online (Sandbox Code Playgroud)
来自海湾合作委员会手册:
ggc 最小扩展
GCC 使用垃圾收集器来管理自己的内存分配。此参数指定垃圾收集器堆在两次收集之间允许扩展的最小百分比。调整此项可能会提高编译速度;它对代码生成没有影响。
默认值为 30% + 70% * (RAM/1GB),当 RAM >= 1GB 时上限为 100%。如果 getrlimit 可用,则“RAM”的概念是实际 RAM、RLIMIT_RSS、RLIMIT_DATA 和 RLIMIT_AS 中最小的一个。如果 GCC 无法计算特定平台上的 RAM,则使用 30% 的下限。将此参数和 ggc-min-heapsize 设置为零会导致每次有机会进行完整收集。这非常慢,但对于调试很有用。
ggc 最小堆大小
垃圾收集器开始收集垃圾之前堆的最小大小。第一次收集发生在堆扩展超出 ggc-min-heapsize ggc-min-expand% 后。同样,调整它可以提高编译速度,并且对代码生成没有影响。默认值为 RAM/8,下限为 4096(4 兆字节),上限为 131072(128 兆字节)。如果 getrlimit 可用,则“RAM”的概念是实际 RAM、RLIMIT_RSS、RLIMIT_DATA 和 RLIMIT_AS 中最小的一个。如果 GCC 无法计算特定平台上的 RAM,则使用下限。将此参数设置得非常大会有效地禁用垃圾收集。将此参数和 ggc-min-expand 设置为零会导致每次有机会进行完整收集。
更多细节:
| 归档时间: |
|
| 查看次数: |
2429 次 |
| 最近记录: |