我使用Visual 2012,在他的例子中,我们将模板参数添加到类“can”中,以便引入"seam point“,以便在单元测试中用模拟对象替换这些部件。
您通常如何在C++中引入seam点:使用基于某些条件的接口和/或使用模板参数与隐式接口的混合?问这个问题的原因之一也是因为有时编译单个C++文件(其中包括模板文件,也可能包含其他模板)会导致在开发人员机器上生成一个大约5-10秒的对象文件。
据我所知,VS编译器在编译模板方面也不是特别快,而且由于模板包含模型(您实际上将模板的定义包含在每个间接使用它的文件中,并且可能在每次修改与模板无关的内容时重新实例化该模板),所以编译时间(增量编译时)可能会出现问题。
在使用模板时(除了一个更好/更快的编译器:-),处理增量编译时间(而且不仅)的方法是什么?
发布于 2013-01-12 09:36:38
如果模板参数只能假定有限(且很小)一组值,则可以在源文件中移动它们的定义,并使用显式实例化。
例如,在aaa.h中,您只声明模板函数f和g:
template <int n>
int f();
template <class T>
void g(int a);假设n模板参数只能是1、3、6,而T模板参数只能是int、long和void *。
然后在aaa.cpp中像这样定义它们:
template <int n>
int f()
{
...
}
template <class T>
void g(int a)
{
...
}
template int f<1>();
template int f<3>();
template int f<6>();
template void g<int>(int a);
template void g<long>(int a);
template void g<void *>(int a);这样,编译器在编译aaa.cpp时实例化给定参数的模板。在编译客户端代码时,它假设定义存在于某个地方,而链接器将处理这个问题。
#include "aaa.h"
int main()
{
f<1>();
f<3>();
f<6>();
g<int>(5);
g<long>(5);
g<void *>(5);
}您也可以显式实例化模板类。缺点是不能将f或g与其他模板参数一起使用。
#include "aaa.h"
int main()
{
f<5>();
}结果:
undefined reference to `int f<5>()'我在一个项目中使用了这种技术,其中很少有复杂类依赖于一组小的(< 10)整数模板参数,而且它大大减少了编译时间(因为编译器在编译客户端代码时不必解析复杂的模板定义)。当然,根据实际代码,您可能会得到较小的改进。
发布于 2013-01-11 21:51:51
有一次,我用了一个奇怪的解决方案来解决类似的问题:包括STL引导编译次数,就像每个源文件几秒钟一样--不管它有多小。所以我把我所有的源文件都包含在一个主文件中,每个文件的编译时间几乎没有改变.这意味着要加快因子20+的速度,因为我只有一个文件要编译。
为了保持设计的整洁,我继续维护makefile,但从未实际使用它(除了验证它仍然有效)。
发布于 2013-01-11 21:38:43
我们过去常常启动一项大任务,在一夜之间构建我们的预编译头和预编译模板,并在第二天针对这些模板进行构建。
https://softwareengineering.stackexchange.com/questions/177546
复制相似问题