C++字符串输出引用参数或返回值,是否有最佳方法?

dew*_*rde 0 c++ c++11 c++03

示例代码:

class Thingy
{
public:
    void doStuff(std::string&);
    std::string doStuff();
};

void Thingy::doStuff(std::string& str) {
    str = "stuff";
}

std::string Thingy::doStuff() {
    return "stuff";
}

int main(int argc, const char* args[])
{
    std::string name;
    Thingy thingy;
    thingy.doStuff(name);
    std::cout << name << " " << thingy.doStuff() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

特别是对于字符串,要么是方法更有效,那么效率"值得"来扭曲代码的可读性或一致性?(例如,如果我不需要,我宁愿不创建名称变量)

事实上,这是(在一天结束时)与此讨论相关的字符串常量吗?

Bat*_*eba 5

std::string不再允许在a上写入语义的复制,因此,表面上看,您可能认为按值返回字符串由于采用了深层复制而在计算上很昂贵.

但是,在C++ 03中,一个好的编译器会忽略深层复制.在C++ 11中,将调用移动构造函数.不会超额复制.

就个人而言,我不喜欢将非const引用传递给函数的模式,因为对调用者来说,修改参数并不是很明显.您也无法将匿名临时文件传递给此类函数(当然在这种情况下您不想这样做).编写函数以返回字符串可以为所有专业人员提供缺点.

  • 事实上,即使在C++ 11中,副本也将被省略(如果可以的话),而不是调用move contstructor.只有当elision失败时才会使用移动构造函数. (2认同)
  • 我很确定 :).至于标准,当然没有,因为标准中没有规定优化.但这是我所知道的所有C++ 11编译器的实际行为.事实上,很难想象不然,因为这意味着C++ 11的表现会比C++ 03差 - 因为即使移动构造函数也比没有构造函数更昂贵. (2认同)