【问题标题】:Is move constructor necessary on (POD) structs?(POD)结构是否需要移动构造函数?
【发布时间】:2013-08-20 23:15:05
【问题描述】:

在 C++11 标准的第 12.8/15 段中定义:

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

这是否意味着:

struct st {
  int a;
  int b;
  // ...
};

// ...
void do_smt(st tmp) {
  st lala(std::move(tmp));
  // ...
}

// ...
int main(int argc, char* argv[]) {
  st test(1, 2);
  do_smt(std::move(test));
}

没有移动构造函数可以工作吗?

【问题讨论】:

  • 嗯...不是移动构造函数明确地使它不是 POD结构吗? (C++11 9/6, 9/10)
  • 移动 int(或任何其他原始类型)与复制相同,因此其工作方式与复制相同。
  • @Praetorian 即使我移动了整个结构?
  • @Praetorian 你不移动一个 pod 你只是复制它甚至整个结构。物理上,POD 位于堆栈上,不间接指向堆上的数据
  • 想想结构体是如何存在于内存中的。如何在不复制的情况下移动它们?移动仅适用于向量之类的东西,因为您可以将指针复制到堆上的数据,而不是整个数据。

标签: c++ constructor move


【解决方案1】:

是的,它可以在不需要指定移动构造函数的情况下工作;在您的示例中,编译器可能会通过初始化 lala 而不是 test 来优化移动操作;检查汇编程序的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 2019-04-09
    • 1970-01-01
    • 2014-11-08
    • 2015-08-04
    • 2014-04-23
    相关资源
    最近更新 更多