引用函数 return 值
Reference to function return value
举个例子:
#include <string>
std::string Foo() {
return "something";
}
std::string Bar() {
std::string str = "something";
return str;
}
我不想复制 return 值,这两个选项之间哪个更好?为什么?
int main() {
const std::string& a = Foo();
std::string&& b = Foo();
// ...
}
如果我现在使用 Bar 函数(而不是 Foo),与上面写的 main() 有什么区别吗?
int main() {
const std::string& a = Bar();
std::string&& b = Bar();
// ...
}
what is better between these two options?
都没有。这是过早优化的练习。你正试图为它做编译器的工作。 Return 值优化和复制省略现在已成为现实。并且移动语义(适用于像 std::string
这样的类型)已经提供了真正有效的回退。
所以让编译器做它的事情,并且更喜欢值语义:
auto c = Foo();
auto d = Bar();
至于Bar
vs Foo
。使用您喜欢的任何一个。 Bar
特别是 RVO 友好。所以两者很可能最终是一样的。
举个例子:
#include <string>
std::string Foo() {
return "something";
}
std::string Bar() {
std::string str = "something";
return str;
}
我不想复制 return 值,这两个选项之间哪个更好?为什么?
int main() {
const std::string& a = Foo();
std::string&& b = Foo();
// ...
}
如果我现在使用 Bar 函数(而不是 Foo),与上面写的 main() 有什么区别吗?
int main() {
const std::string& a = Bar();
std::string&& b = Bar();
// ...
}
what is better between these two options?
都没有。这是过早优化的练习。你正试图为它做编译器的工作。 Return 值优化和复制省略现在已成为现实。并且移动语义(适用于像 std::string
这样的类型)已经提供了真正有效的回退。
所以让编译器做它的事情,并且更喜欢值语义:
auto c = Foo();
auto d = Bar();
至于Bar
vs Foo
。使用您喜欢的任何一个。 Bar
特别是 RVO 友好。所以两者很可能最终是一样的。