这个问题可能有些奇怪,但我怎样才能加快g ++编译时间?我的C++代码大量使用boost和模板.我已经尽可能多地从头文件中移动并使用-j选项,但是编译(和链接)仍需要很长时间.
是否有任何工具可以分析我的代码并指出编译器的瓶颈?或者可以以某种方式分析在我的代码上运行的编译器?这将是非常好的,因为有时我有这样的印象,我花了太多时间盯着编译器控制台日志...
我必须处理一个由许多模板化类组成的库,这些类当然都是在头文件中实现的.现在我正试图找到一种方法来减少无法忍受的长编译时间,因为我几乎必须在每个编译单元中包含整个库.
尽管有模板,使用前向声明是否可能?我正在尝试下面的例子中的一些东西,我尝试绕过它#include <vector>,作为一个例子,但它给了我一个链接器错误,因为push_back未定义.
#include <iostream>
namespace std {
template<class T>
class vector {
public:
void push_back(const T& t);
};
}
int main(int argc, char** argv) {
std::vector<int>* vec = new std::vector<int>();
vec->push_back(3);
delete vec;
return EXIT_SUCCESS;
}
$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我尝试了一次预编译的头文件但是根本没有改变编译时间(我确实确实加载了它们而不是真正的头文件).但是,如果你们都说预编译头应该是可行的方式,那么我将再试一次.
更新:有些人说,转发声明STL类是不值得的.我应该强调,vector上面的STL 只是一个例子.我并没有真正尝试向前声明STL类,但它是关于我必须使用的某些库的其他严格模板化的类.
更新2:有没有办法使上面的例子实际编译和链接正确?Logan建议使用-fno-implicit-templates并放在template class std::vector<int>某个地方,大概是一个.cpp可以编译的单独文件-fno-implicit-templates,但我仍然会遇到链接器错误.再次,我试图理解它是如何工作的,std::vector以便我可以将它应用于我实际使用的模板化类.
很确定我已经知道答案,但值得一试.
所以,说我有一个类型列表:
template <typename ...Ts>
struct typelist{};
Run Code Online (Sandbox Code Playgroud)
那包含一些对象:
struct foo{};
struct bar{};
struct quux{};
using objects = typelist<foo, bar, quux>;
Run Code Online (Sandbox Code Playgroud)
现在我有一个模板化的class(baz)可以接受任何这些对象.但是,由于代码库大小和编译时间,我希望在cpp文件中实现我的模板化方法.
所以在baz.cpp的底部,我有:
template <> class baz<foo>;
template <> class baz<bar>;
template <> class baz<quux>;
Run Code Online (Sandbox Code Playgroud)
问题是我有很多类baz,并且他们使用的对象列表也在不断变化.那么......无论如何我可以保留我的单个对象类型列表并在每个baz类似对象的cpp文件中使用它来专门化吗?然后,当我有一个新对象并且所有目标文件将重建时,我所要做的就是更新我的类型列表.