我正在使用一些模板元编程来解决一个小问题,但语法有点烦人——所以我想知道,在下面的示例中,是否会在具有空构造函数的元类上重载运算符导致(运行时)性能损失?是否会实际构建所有临时对象,还是可以假设它们将被优化掉?
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
都已完全优化。
因此,它们同样快,并且有一个像样的编译器(只要打开了优化)。
关于c++ - 使用 C++ 元编程模板重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061993/