gpt4 book ai didi

c++ - 使用 C++ 复制省略和运算符重载

转载 作者:行者123 更新时间:2023-12-04 07:30:16 25 4
gpt4 key购买 nike

我有一个结构,例如:

struct A { 
double x,y;
vector<double> vec;
};
我想重载诸如加号运算符之类的运算符,以便我可以执行以下操作:
A a,b,c,d;
//do work to set up the four structs. Then:
d = a + b + c;
性能很重要,因为这些操作将在运行多次的“内部循环”中执行。我担心该行 (a + b + c) 将创建临时对象,因此不必要地将构造函数运行到 'A'。 运行 C++17,编译器一定会使用复制省略来避免创建临时文件吗? 我需要运行“d=a+b+c”行,而无需将构造函数运行到 A。
我知道,如果我绝对可以通过写作来避免临时性:
d = a;
d += b;
d += c;
但是,实际上,我将要编写大量带有数学行长的代码,并且能够在一行 (a + b + c) 中编写所有内容,而不是必须打破它会方便得多成吨的“+=”行。

最佳答案

正如评论者所建议的,如果您的 operator+需要一个临时的,你还是构造一个 vector并返回它,即使 NRVO'd。
但是,如果你想这样做,你可以减少创建的临时文件的数量:

  • 创建一个右值限定 operator+实现
  • 使用移动赋值运算符将结果 vector 移动到 d ,或移动构造函数使临时变为 d无需

  • 考虑一下:
    A operator+(A& a, const A& b){
    A temp = /*...*/;
    return temp; // NRVO
    }

    A operator+(A&& a, const A& b){
    // We know a is temporary, so we can move its guts to a new one.
    a += b;
    return std::move(a); // In this case, we require the move, as it's not NRVO
    }

    // Then use it:
    A d = a + b + c;
    // What this does:
    // 1. Calls `a + b` and creates a temporary, as both are lvalues
    // 2. Utilizes the same temporary to put the result of (a+b) + c
    // 3. Still utilizes the same temporary to materialize the rvalue into d

    关于c++ - 使用 C++ 复制省略和运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67975241/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com