【发布时间】:2014-09-25 10:06:21
【问题描述】:
我正在使用 大量 模板进行 C++ 大学研究项目,这些模板具有进一步的嵌套模板等。该项目是关于特定研究领域的有效索引数据结构。你可以想象:一个索引结构有很多参数需要调整,所以我们过度使用模板参数。当然,我们想用不同的参数集来测试我们的索引,所以有相当多的模板实例化。
这个项目并没有那么大。也许 50k LOC。但是,链接仍然需要 50 秒并消耗超过 7 GB 的内存 (!!!)。我在一个 32GB 的工作站上,所以对我来说一切都很好。我经常有学士和硕士生从事这个项目。问题是他们经常在具有 4 或 8 GB RAM 的笔记本电脑上工作。因此,这些学生在编译该项目时遇到了很大的麻烦。生成的测试二进制文件(即仅包含索引结构的单元测试的二进制文件)为 700 兆字节。
其中大部分是符号,因为嵌套模板会产生巨大的名称。如果我在二进制文件上使用strip,它会下降到 8 兆字节。
那么有没有办法减少链接期间的 RAM 使用量?即使使用嵌套模板,有没有办法让符号更小?
我们在 Ubuntu 14.10 下使用 g++4.9 和 std=c++11 编译。
编辑:
看起来确实是嵌套模板。我们有两个测试用例,模板嵌套非常深。用于这些测试的两个.o 文件几乎占最终二进制文件内存的 90%。它们导致方法名称超过 3000 个字符。这里没有办法不使用嵌套模板,因为它们形成了示例查询的“处理树”。使用深度嵌套的模板时,有什么方法可以使名称保持简短?
【问题讨论】:
-
什么操作系统,编译器版本?
-
@EdChum:Ubuntu 14.10 下的 g++4.9。现在将其添加到问题中。
-
哪个 C++ 版本? C++11 有外部模板!
-
只是想知道你的 make 文件中是否设置了
-j标志:gnu.org/software/make/manual/html_node/Parallel.html,听起来此时使用 clang 会更好 -
“我们想用不同的参数集测试我们的索引”——也许一些小的测试程序可能比一个大的更好?
标签: c++ templates c++11 linker