避免内联显式实例化的 std::vector<T> 代码?(Visual Studio C++ 2008)

Avoid inlining of explcitly instantiated std::vector<T> code? (Visual Studio C++ 2008)

本文关键字:代码 gt Visual Studio 2008 C++ 实例化 std lt vector      更新时间:2023-10-16

我想在我正在处理的大型项目中减小.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++编译的工作原理,你在这里什么都做不了。