【问题标题】:move semantic and struct [duplicate]移动语义和结构
【发布时间】:2013-02-11 00:51:08
【问题描述】:

我有一个函数

struct foo {
    std::vector<int> v;
};

foo func();

foo里面的向量在函数返回时会被移动还是复制?

【问题讨论】:

  • 不,它会被移动。
  • 这完全取决于func内部发生的事情。
  • @BoPersson 不完全是,因为这个问题是关于返回一个 vector,而这是关于返回一个带有默认移动构造函数和一个 vector 成员的结构。
  • @delnan - 没有区别。另一个问题是关于一般的返回值,涵盖了这种情况。
  • @BoPersson 这里重要的一件事,我在那个问题的任何地方都没有找到,是移动没有用户定义的移动构造函数的结构是移动成员还是复制它们。我不怀疑以前也有人问过并回答过这个问题,但是您链接到的具体问题并不能完全解决恕我直言。

标签: c++ c++11


【解决方案1】:

它将被移动.(*)

由于您没有为您的foo 类提供显式移动构造函数,编译器将为您隐式生成一个为您的类的所有成员调用移动构造函数(如果可用)。由于std::vector定义了移动构造函数,所以会被调用。

根据 C++11 标准的第 12.8/15 段:

非联合类 X 的隐式定义复制/移动构造函数执行成员方式复制/移动 其基地和成员。 [...]

还要注意,当按值返回对象时,允许编译器省略对类的复制/移动构造函数的调用。这种优化称为(Named) Return Value Optimization

(*) 我在这里假设您的用例是在foo() 内创建一个具有自动存储功能的本地对象并将其返回。

【讨论】:

  • 如果它返回的foo 可能是具有静态存储持续时间的foo,它不会被移动。可能还有其他一些情况。但是,是的,对于提问者可能询问的情况,我同意你的看法。
  • @sftrabbit:好的,没错。我假设他想返回一个带有自动存储的本地对象。已编辑,谢谢。
  • @BoPersson:我确实提到了这一点,尽管没有明确提到 RVO。我会做的。
猜你喜欢
  • 2020-12-27
  • 2015-09-19
  • 2013-11-05
  • 2016-02-04
  • 2020-08-20
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多