宏由预处理器扩展,模板由编译器扩展。
但是,就编译/构建时间而言,哪一个需要更长的时间?
发布于 2010-07-05 11:36:55
毫无疑问,模板需要更长的时间。
但是,模板的功能要强大得多,并且遵循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倍。宏不能做到这一点。
发布于 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) }
将按预期工作,因为这一次编译器将处理语句并从参数中提取变量,而不是像预处理器宏那样简单地替换文本。当然,这意味着解析参数,并且每次调用模板时,解析都会占用编译时间。
发布于 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链接为您提供了足够的信息。
https://stackoverflow.com/questions/3177116
复制相似问题