示例代码:
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
出现时,与按值返回相关的性能问题已经显著减少。