避免内联显式实例化的 std::vector<T> 代码?(Visual Studio C++ 2008)
Avoid inlining of explcitly instantiated std::vector<T> code? (Visual Studio C++ 2008)
我想在我正在处理的大型项目中减小.obj文件的大小(我知道链接器会删除重复的定义,但我想加快构建过程)。它们大小的原因之一是,每个使用std::vector<double>
或std::vector<std::string>
的类最终都会编译这个类的代码,并将其放在其.obj文件中。我试图显式实例化std::vector<double>
并使用extern template
声明,但它不起作用——Visual Studio C++STL中的std::vector
具有内联的所有方法。除了修改STL代码(我不会这么做),有没有任何方法可以强制编译器不要内联实例化方法,并使用std::vector<double>
的外部实例化版本?
唯一想到的是编写一个包含标头,该标头定义std::vector
模板(但不定义其成员,只需要声明这些成员),并包含该模板,而不是vector
标准标头。
然后,您可以在一个单独的编译单元中显式实例化std::vector<whatever>
,并链接到它。
要显式实例化模板,不要使用extern template
(这不起作用),只需使用以下内容:
#include <vector> // The standard header, not your forward-declaration!
template class std::vector<double>;
我现在的建议是考虑破解,因为会对代码进行卷积以实现编译器优化。在尝试此操作之前,应先调查编译器标志。
总之,编译器放入obj文件的内容是依赖于编译器的,但我建议尝试继承向量的特殊化,并使用这种特殊化。我可以想象,这将使编译器创建一个包含向量专用化的obj文件,允许包装向量的所有用户使用它。
除非您更改vector
标头或提供仅包含声明的等效标头,否则它不可能做到这一点。否则,无论何时#include
文件vector
,其内容都会进入包含文件并进行编译,并且模板在第一次使用时会实例化。然后链接器将消除重复项。这就是C++编译的工作原理,你在这里什么都做不了。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型