考虑我有以下功能:
std::string foo();
这样做是否有优势:
const std::string& ref = foo();
对此:
std::string val = foo();
或者编译器足够聪明,可以在第二种情况下进行优化。
答案 0 :(得分:4)
大多数人都会触发NRVO。让我们举个例子
std::string foo()
{
std::string s1;
// fill up s1 with content
return s1;
}
void bar()
{
std::string s2 = foo();
std::cout << s2;
}
这既不会复制也不会移动,而是返回值(s1)将直接在s2构建。这称为返回值优化,它意味着你不应该通过const引用返回,或者通过const引用捕获作为某种性能破解,它将不起作用,或者减慢速度,取决于它。