首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏和模板之间的DIfference -编译/构建时间

宏和模板之间的DIfference -编译/构建时间
EN

Stack Overflow用户
提问于 2010-07-05 11:35:08
回答 4查看 18.6K关注 0票数 6

宏由预处理器扩展,模板由编译器扩展。

但是,就编译/构建时间而言,哪一个需要更长的时间?

EN

回答 4

Stack Overflow用户

发布于 2010-07-05 11:36:55

毫无疑问,模板需要更长的时间。

但是,模板的功能要强大得多,并且遵循C++语法规则,而宏则不然。

模板耗时较长的原因是,您可以拥有一个递归的模板,并且所有这些递归都需要生成。这是在模板元编程中构建循环构造的基础。相比之下,宏不能调用自身,因此仅限于单个扩展。

例如,以下面的代码为例,这些代码是无耻地从Wikipedia窃取的

代码语言:javascript
复制
template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
    int x = Factorial<4>::value; // == 24
    int y = Factorial<0>::value; // == 1
}

注意阶乘是如何在编译时计算的,对于第一次调用(Factorial<4>),编译器需要将模板扩展5倍。宏不能做到这一点。

票数 15
EN

Stack Overflow用户

发布于 2013-02-04 01:48:32

模板肯定需要更长的时间来编译,但更安全。假设你定义了

#define min(i, j) (((i) < (j)) ? (i) : (j))

然后使用

int x = min (a++,b)

这将扩展到

int x = (((a++) < (b)) ? (a++) : (b))

这会使“a”增加两倍。模板

template<class T> T min (T i, T j) { return ((i < j) ? i : j) }

将按预期工作,因为这一次编译器将处理语句并从参数中提取变量,而不是像预处理器宏那样简单地替换文本。当然,这意味着解析参数,并且每次调用模板时,解析都会占用编译时间。

票数 2
EN

Stack Overflow用户

发布于 2010-07-05 11:37:26

你检查过这上面的msdn链接吗

http://msdn.microsoft.com/en-us/library/z3f89ch8(VS.80).aspx#_core_When_Should_You_Use_Templates.3fAnchor1

模板需要更长的构建时间,但它的优点超过了编译所需的额外时间。THe msdn链接为您提供了足够的信息。

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

https://stackoverflow.com/questions/3177116

复制
相关文章

相似问题

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