c++字符串输出引用参数或返回值,是否有最优的方法

C++ String output reference parameter or return value, is there an optimal approach?

本文关键字:是否 方法 返回值 输出 字符串 引用 参数 c++      更新时间:2023-10-16

示例代码:

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

特别是对于字符串,这两种方法是否更有效,这种效率是否"值得"去扭曲代码的可读性或一致性?(例如,如果没有必要,我宁愿不创建name变量)

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

std::string上不再允许写时复制语义,因此,表面上,您可能会认为按值返回字符串由于进行深度复制而在计算上很昂贵。

但是,在c++ 03中,一个好的编译器将省略深层拷贝。在c++ 11中,将调用move构造函数。不接受超值拷贝。

我个人不喜欢传递一个非const引用到函数的模式,因为它不是立即明显的调用者,参数被修改。您也不能将匿名临时对象传递给这样的函数(当然,在本例中您不希望这样做)。编写返回字符串的函数给了你所有的优点而没有缺点。

返回字符串方法更有效,因为它只值一个字符串构造(由于RVO)。对我来说也更容易理解。

如果字符串不长,那么按值返回也不是那么糟糕!特别是,它将允许使用"."操作符连接东西。而且,现在在c++ 11中,当move constructor出现时,与按值返回相关的性能问题已经显著减少。