首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用模板时,如何处理越来越长的编译时间?

在使用模板时,如何处理越来越长的编译时间?
EN

Software Engineering用户
提问于 2012-11-28 17:50:49
回答 3查看 12.1K关注 0票数 14

我使用Visual 2012,在他的例子中,我们将模板参数添加到类“can”中,以便引入"seam point“,以便在单元测试中用模拟对象替换这些部件。

您通常如何在C++中引入seam点:使用基于某些条件的接口和/或使用模板参数与隐式接口的混合?问这个问题的原因之一也是因为有时编译单个C++文件(其中包括模板文件,也可能包含其他模板)会导致在开发人员机器上生成一个大约5-10秒的对象文件。

据我所知,VS编译器在编译模板方面也不是特别快,而且由于模板包含模型(您实际上将模板的定义包含在每个间接使用它的文件中,并且可能在每次修改与模板无关的内容时重新实例化该模板),所以编译时间(增量编译时)可能会出现问题。

在使用模板时(除了一个更好/更快的编译器:-),处理增量编译时间(而且不仅)的方法是什么?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2013-01-12 09:36:38

如果模板参数只能假定有限(且很小)一组值,则可以在源文件中移动它们的定义,并使用显式实例化

例如,在aaa.h中,您只声明模板函数fg

代码语言:javascript
运行
复制
template <int n>
int f();

template <class T>
void g(int a);

假设n模板参数只能是1、3、6,而T模板参数只能是intlongvoid *

然后在aaa.cpp中像这样定义它们:

代码语言:javascript
运行
复制
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时实例化给定参数的模板。在编译客户端代码时,它假设定义存在于某个地方,而链接器将处理这个问题。

代码语言:javascript
运行
复制
#include "aaa.h"

int main()
{
    f<1>();
    f<3>();
    f<6>();

    g<int>(5);
    g<long>(5);
    g<void *>(5);
}

您也可以显式实例化模板类。缺点是不能将fg与其他模板参数一起使用。

代码语言:javascript
运行
复制
#include "aaa.h"

int main()
{
    f<5>();
}

结果:

代码语言:javascript
运行
复制
undefined reference to `int f<5>()'

我在一个项目中使用了这种技术,其中很少有复杂类依赖于一组小的(< 10)整数模板参数,而且它大大减少了编译时间(因为编译器在编译客户端代码时不必解析复杂的模板定义)。当然,根据实际代码,您可能会得到较小的改进。

票数 11
EN

Software Engineering用户

发布于 2013-01-11 21:51:51

有一次,我用了一个奇怪的解决方案来解决类似的问题:包括STL引导编译次数,就像每个源文件几秒钟一样--不管它有多小。所以我把我所有的源文件都包含在一个主文件中,每个文件的编译时间几乎没有改变.这意味着要加快因子20+的速度,因为我只有一个文件要编译。

为了保持设计的整洁,我继续维护makefile,但从未实际使用它(除了验证它仍然有效)。

票数 2
EN

Software Engineering用户

发布于 2013-01-11 21:38:43

我们过去常常启动一项大任务,在一夜之间构建我们的预编译头和预编译模板,并在第二天针对这些模板进行构建。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/177546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档