宏由预处理器扩展,模板由编译器扩展。
但是,就编译/构建时间而言,哪一个需要更长时间?
答案 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链接模板需要更长的构建时间,但其优势超过了编译所需的额外时间。 msdn链接为您提供了足够的信息。
答案 3 :(得分:1)
模板导致代码替换,但遵守一组规则。这意味着编译器在创建新类/对象之前检查类型。宏由预处理器解析,只替换文本。
因此,模板总是需要更长的时间来处理。但是,宏生成的代码可能需要一定的时间来处理。