0

我正在使用一些模板元编程来解决一个小问题,但是语法有点烦人——所以我想知道,在下面的示例中,在具有空构造函数的元类上重载运算符会导致 (运行时)性能损失?是否会实际构建所有临时对象,或者是否可以假设它们将被优化?

template<int value_>
struct Int {
    static const int value = value_;

    template<typename B>
    struct Add : public Int<value + B::value> {  };

    template<typename B>
    Int<value + B::value> operator+(B const&) { return Int<value + B::value>(); }
};

int main()
{
    // Is doing this:
    int sum = Int<1>::Add<Int<2> >().value;

    // any more efficient (at runtime) than this:
    int sum = (Int<1>() + Int<2>()).value;

    return sum;
}
4

2 回答 2

2

好的,我在 GCC 下尝试了我的示例。

对于Add没有优化的版本 ( -O0),生成的程序集只是将一个常量加载到 sum 中,然后返回它。

对于operator+没有优化的版本 ( -O0),生成的程序集会做更多的事情(它似乎在调用operator+)。

但是,-O3两个版本都生成相同的程序集,只是3直接加载到返回寄存器中;在这两种情况下,临时变量、函数调用和sum已完全优化。

因此,它们与一个体面的编译器同样快(只要打开了优化)。

于 2013-02-25T08:05:51.887 回答
0

比较两种解决方案的 g++ -O3 -S 生成的汇编代码。它为两种解决方案提供了相同的代码。它实际上优化了代码以简单地返回 3。

于 2013-02-25T08:05:40.280 回答