宏和模板之间的差异 - 编译/构建时间

时间:2010-07-05 03:35:08

标签: c++

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

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

4 个答案:

答案 0 :(得分:13)

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

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

模板花费更长时间的原因是因为您可以使用递归模板,并且需要生成所有这些重复。这是构建模板元编程中的循环结构的基础。相反,宏不能自称,因此仅限于一次扩展。

例如,从Wikipedia

中无耻地窃取以下代码
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次。宏无法做到这一点。

答案 1 :(得分:2)

模板绝对需要更长时间才能编译,但更安全。假设你定义了 #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 :(得分:1)

您是否检查了此

上的msdn链接

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

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

答案 3 :(得分:1)

模板导致代码替换,但遵守一组规则。这意味着编译器在创建新类/对象之前检查类型。宏由预处理器解析,只替换文本。

因此,模板总是需要更长的时间来处理。但是,宏生成的代码可能需要一定的时间来处理。