0

据我了解,普通的 C++ 代码在编译时被翻译成汇编程序,然后由 CPU 在运行时执行。所以我不太明白模板元编程的优点有什么大惊小怪的?

维基百科对模板元编程有以下说法:

模板元编程是一种元编程技术,其中编译器使用模板生成临时源代码,编译器将其与源代码的其余部分合并,然后进行编译。这些模板的输出包括编译时常量、数据结构和完整的函数。模板的使用可以被认为是编译时执行。

这似乎并没有真正向我强调模板元编程的优势......?

我之所以问,是因为我对模板元编程可以做什么来优化/提高低延迟 C++ 应用程序的效率感兴趣。在此过程中,我可能没有正确理解某些内容,因此请随时纠正我的理解。

4

2 回答 2

3

您是否阅读过无数篇彻底讨论 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-23T20:25:19.870 回答
0

另一个例子是如何计算斐波那契数列。

正常的递归方式:

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。递归函数可能无法工作并崩溃,使用元编程的函数将非常好并且非常快。

于 2013-02-24T11:06:01.223 回答