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

标签 c++ performance template-meta-programming

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

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/

相关文章:

java - 替代嵌套 for 循环来提高代码性能?

c++ - 用函数模板和SFINAE按参数区分

c++ - 如何将 mpl::set 的内容扩展为函数模板的模板参数

c++ - 如何反转整数参数包?

c++ - 使用 strcpy() 获取 char* 的一部分会导致程序崩溃

c++ - 无法输出到 QTextEdit

c++ - 如何包含另一个目录中的 DLL

c++ - 为什么不使用指针读取Struct?

MySQL 性能 - 字符串与整数

spring - 为什么接口(interface)投影比 Spring Data JPA with Hibernate 中的构造函数投影和实体投影慢得多?