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

时间:2015-08-25 13:17:33

标签: 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;
}

特别是对于字符串来说,要么提高效率,要么就是效率&#34;值得它&#34;扭曲代码的可读性或一致性? (例如,如果我不必,我不想创建名称变量)

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

3 个答案:

答案 0 :(得分:5)

std::string上的写语义进行复制是不再允许的,因此,表面上看,您可能会认为按值返回字符串的计算成本很高,因为需要进行深层复制。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果字符串不长,那么按值返回并不是那么糟糕!特别是它允许使用“.”运算符来连接事物。 此外,现在在C ++ 11中,当出现move constructor时,与按值返回相关的性能问题已显着降低。