在C++中,从函数返回函数local std :: string变量的最佳方法是什么?
std::string MyFunc()
{
std::string mystring("test");
return mystring;
}
std::string ret = MyFunc(); // ret has no value because mystring has already gone out of scope...???
Run Code Online (Sandbox Code Playgroud)
Chu*_*dad 70
不,那不是真的.即使mystring已经超出范围并被销毁,ret也有一个mystring的副本,因为函数MyFunc按值返回.
Kir*_*rov 21
如果您的代码如下,则会出现问题:
std::string& MyFunc()
{
std::string mystring("test");
return mystring;
}
Run Code Online (Sandbox Code Playgroud)
所以,你写它的方式还可以.只有一个建议 - 如果你可以构造这样的字符串,我的意思是 - 你可以在一行中完成它,有时候这样做更好:
std::string MyFunc()
{
return "test";
}
Run Code Online (Sandbox Code Playgroud)
或者如果它更"复杂",对于ex:
std::string MyFunct( const std::string& s1,
const std::string& s2,
const char* szOtherString )
{
return std::string( "test1" ) + s1 + std::string( szOtherString ) + s2;
}
Run Code Online (Sandbox Code Playgroud)
这将为您的编译器提供更多优化的提示,因此它可以减少一个字符串副本(RVO).
typ*_*gic 19
之前的答案都没有包含这里的关键概念。这个概念就是移动语义。该类std::string具有move构造函数,这意味着它具有移动语义。移动语义意味着对象不会在函数返回时复制到不同的位置,从而提供更快的函数执行时间。
尝试对返回的函数进行单步调试std::string,并检查即将返回的对象的内部结构。您将看到一个成员字段指针地址xxx。然后,检查std::string接收函数返回值的变量。您将在该对象中看到相同的指针地址xxx。
这意味着女士们先生们,没有发生任何复制行为。这就是举动语义,上帝保佑美国!
你试过吗?返回时会复制该字符串.嗯,这是官方的路线,实际上副本可能已经优化了,但无论哪种方式都可以安全使用.
| 归档时间: |
|
| 查看次数: |
79169 次 |
| 最近记录: |