【问题标题】:How are created string passed back from function [duplicate]如何从函数传回创建的字符串[重复]
【发布时间】:2016-12-25 19:36:15
【问题描述】:

这会在返回时进行复制还是编译器会做一些魔术?什么是神奇的共享堆栈空间?

string getCamel()
{
    string s = "Camel";
    return s;
}

main()
{
    string myStr = getCamel();
}

【问题讨论】:

  • 副本可以省略,不需要。
  • This 看起来像你要找的东西
  • 从C++11开始,不能有拷贝,只有可选的移动构造函数。
  • @aschepler 否。仅从 C++17 开始保证复制省略(在某些情况下)。对于 C++11 编译器进行复制仍然是完全有效的(即使它可以删除复制或移动) - 但现代编译器会努力删除或移动。
  • @JesperJuhl 不,当您 return 使用命名局部变量的标识符时,编译器必须在复制构造函数之前搜索移动构造函数。 C++14 12.8/32.

标签: c++


【解决方案1】:

编译器可以执行“魔术”,即直接在返回时分配的变量中构造字符串。这称为“复制省略”和“返回值优化”。允许这样做,尽管不是必需的(直到 C++17 在某些情况下需要它)。

对于 C++11 及更高版本,如果类型具有移动构造函数,编译器还可以选择将变量“移动”到目标中 - 比复制成本低,但比仅省略操作和直接构造成本更高在目的地。

有关详细信息,请参阅这些参考资料:

http://en.cppreference.com/w/cpp/language/copy_elision

https://en.m.wikipedia.org/wiki/Return_value_optimization

http://en.cppreference.com/w/cpp/language/move_constructor

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2015-05-28
    • 2015-06-20
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多