首页 > 解决方案 > 我们需要设置移动构造函数=默认吗?对于过去使用 C++98/03 用户声明的析构函数 buildet 的遗留类?

问题描述

所以问题是,让我们考虑一个大型的 C++ 遗留项目,过去总是为 C++98/03 标准构建。

并且项目遵循三的规则,因此项目中有很多用户定义的析构函数。

如果现在项目是为标准 C++11/14/17 构建的,手动设置移动构造函数 = 默认值是个好主意吗?

因为由于 Howard Hinnant 在 Accu_2014 上展示的幻灯片,这些类不会自动提供移动构造函数。 ACCU2014 Howard Hinnant,特别成员

所以问题是通过为每个类设置移动构造函数=默认值,项目是否可以提高性能?

更准确地说,在设置 move constructor = default 之后,应用程序完全像以前一样运行并且所有单元测试都像以前一样工作。

您认为通过定义移动构造函数 = 默认值会带来性能优势吗?

谢谢

标签: c++c++11

解决方案


您认为通过定义移动构造函数 = 默认值会带来性能优势吗?

如果不研究代码库并运行一些基准测试,就无法预测这一点。可悲的是,它可能会对您的运行时性能产生积极影响。拥有一个= default移动构造函数和移动赋值运算符,并且考虑到它们做正确的事情绝不是悲观的。可能发生的最糟糕的事情是您的数据成员不会从移动构造中受益(例如,您有一个std::array<int, 1000>数据成员),然后您最终会像以前一样进行复制。

该项目遵循三原则

当您对代码进行现代化改造时,这会导致一致性问题。在 C++11 中,三法则现在是五法则。因此,如果您到现在为止都遵循三规则,您应该迁移到五规则以保持一致,除了您可能获得的运行时性能优势。

= default手动设置移动构造函数是个好主意吗?

不,使用clang-tidyC.21检定让工具对你大喊大叫。


推荐阅读