据我所知,普通的C++代码在编译时被转换成汇编程序,然后由CPU在运行时执行。因此,我不太明白模板元编程的优点是什么?
维基百科介绍了关于模板元编程的如下内容:
模板元编程是一种元编程技术,编译器使用模板生成临时源代码,编译器将其与其他源代码合并,然后编译。这些模板的输出包括编译时常量、数据结构和完整函数。模板的使用可以看作是编译时的执行。
这似乎并没有真正强调模板元编程对我的好处.?
我之所以问这个问题,是因为我对模板元编程可以做什么来优化/提高低延迟C++应用程序的效率感兴趣。在此过程中,我可能还没有正确理解一些东西,所以请随时纠正我的理解。
发布于 2013-02-23 20:25:19
你读过无数篇关于TM的文章吗?例如:
一种简单的看待(一种)模板元编程的方法是“强”回忆录。以下是一个常见的例子:
假设您的程序需要计算某个数字的阶乘。使用TM,您可以在编译时计算阶乘,这会增加编译时间(和二进制大小),但会减少运行时。示例代码来自上面的第二个站点;如果您是以“天真”的方式这样做的,那么您的代码如下所示:
int factorial( int n) {
return (n==0) ? 1 : n*factorial(n-1)l
}
int main() {
cout << factorial(5) << endl;
return 0;
}使用TM,我们可以在编译时计算阶乘:
// factorial.cpp
#include <iostream>
template <int N>
struct Factorial {
enum { value = N * Factorial<N-1>::value };
};
template <>
struct Factorial<1> {
enum { value = 1 };
};
// example use
int main() {
const int fact5 = Factorial<15>::value;
std::cout << fact5 << endl;
return 0;
}这里,Factorial<15>::value本质上是一个编译时常数。和往常一样,简单的示例并不特别有用,但希望您能够理解其中的要点。
发布于 2013-02-24 11:06:01
另一个例子是如何计算斐波纳契序列。
执行此操作的正常递归方法:
uint64_t fibonacci(int n) {
if (n <= 2)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}使用元编程:
template< int n > struct Fibonacci {
static const uint64_t value = Fibonacci< n-1 >::value + Fibonacci< n-2 >::value;
};
template<> struct Fibonacci< 1 > {
static const uint64_t value = 1;
};
template<> struct Fibonacci< 0 > {
static const uint64_t value = 0;
};现在,您可以自己尝试调用fibonacci(80)或Fibonacci<80>::value。递归函数可能无法工作和崩溃,使用元编程的函数将非常精细和快速。
https://stackoverflow.com/questions/15045112
复制相似问题