用C++元编程模板重载运算符

Overloading operators with C++ metaprogramming templates

本文关键字:重载 运算符 编程 C++      更新时间:2023-10-16

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

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;
}

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

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

对于没有优化的operator+版本(-O0(,生成的程序集会执行更多操作(它似乎在调用operator+(。

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

因此,它们同样快有一个不错的编译器(只要启用了优化(。

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