示例代码:
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;扭曲代码的可读性或一致性? (例如,如果我不必,我不想创建名称变量)
事实上,这是(在一天结束时)与此讨论相关的字符串常量吗?
答案 0 :(得分:5)
对std::string
上的写语义进行复制是不再允许的,因此,表面上看,您可能会认为按值返回字符串的计算成本很高,因为需要进行深层复制。
但是,在C ++ 03中,一个好的编译器将 elide 深层拷贝。在C ++ 11中,将调用移动构造函数。不会超额复制。
我个人不喜欢将非const
引用传递给函数的模式,因为对调用者来说,修改参数并不是很明显。您也无法将匿名临时文件传递给此类函数(当然在这种情况下您不想这样做)。编写函数以返回字符串可以为所有专业人员提供缺点。
答案 1 :(得分:0)
返回字符串方法更有效,因为它只值一个字符串构造(由于RVO)。至于我,它也更容易理解。
答案 2 :(得分:0)
如果字符串不长,那么按值返回并不是那么糟糕!特别是它允许使用“.
”运算符来连接事物。
此外,现在在C ++ 11中,当出现move constructor
时,与按值返回相关的性能问题已显着降低。