c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?

标签 c++ optimization c++11 move-semantics

鉴于一个类实际上是可 move 的,手动实现类的 move 构造函数和 move 赋值运算符很快就会变得乏味。

我想知道什么时候这样做实际上是一个沉重、沉重、过早的优化?

例如,如果一个类只有微不足道的 POD 数据或本身定义了 move 构造函数和 move 赋值运算符的成员,那么我猜编译器要么只是优化大量的垃圾(在POD),否则使用成员的 move 构造函数和 move 赋值运算符。

但这能保证吗?在什么情况下我应该期望明确需要实现 move 构造函数和 move 赋值运算符?

编辑:如下所述,Nicol Bolas 在 https://stackoverflow.com/a/9966105/6345 对他的回答的评论中提到,在 Visual Studio 11 Beta(及之前)没有 move 构造函数或 move 赋值运算符永远自动生成。引用:http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

最佳答案

如果您发现自己正在实现,任何一个:

  • 析构函数
  • 复制构造函数
  • 复制作业

那么你应该问问自己是否需要实现 move 构造。如果您“= default”上述任何一项,您应该问自己是否还应该“= default” move 成员。

更重要的是,您应该记录和测试您的假设,例如:

static_assert(std::is_nothrow_default_constructible<A>::value, "");
static_assert(std::is_copy_constructible<A>::value, "");
static_assert(std::is_copy_assignable<A>::value, "");
static_assert(std::is_nothrow_move_constructible<A>::value, "");
static_assert(std::is_nothrow_move_assignable<A>::value, "");
static_assert(std::is_nothrow_destructible<A>::value, "");

关于c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9965461/

相关文章:

reactjs - 当使用 redux 和 immutable-js 时 - 你会在选择器上调用 toJS() 吗?或者您在渲染函数中使用 .get ('prop' )吗?

c++ - 是否每个循环都会评估基于 C++11 范围的 for 循环条件?

c++ - 在这种情况下,模板参数推导如何工作?

java - 是Java -XX :+UseParNewGC garbage collection option still buggy?

c++ - 将 std::vector<const Type*> 转换为 const std::vector<T, A> &Vec

c++ - LINK 2019 将 .then() 添加到异步 cpp 代码时未解析的外部符号 "CaptureUiThreadContext"

c++ - 在 C++ 中用 "fopen"打开的 mmap 文件

javascript - 使用许多事件监听器优化 javascript 性能

c++ - 使用 boost 或 std 获取特定时区的当前本地时间

c# - WinRT 中字段的正确命名约定是什么