c++ - 我们需要设置移动构造函数=默认吗?对于过去使用 C++98/03 用户声明的析构函数 buildet 的遗留类?
问题描述
所以问题是,让我们考虑一个大型的 C++ 遗留项目,过去总是为 C++98/03 标准构建。
并且项目遵循三的规则,因此项目中有很多用户定义的析构函数。
如果现在项目是为标准 C++11/14/17 构建的,手动设置移动构造函数 = 默认值是个好主意吗?
因为由于 Howard Hinnant 在 Accu_2014 上展示的幻灯片,这些类不会自动提供移动构造函数。
所以问题是通过为每个类设置移动构造函数=默认值,项目是否可以提高性能?
更准确地说,在设置 move constructor = default 之后,应用程序完全像以前一样运行并且所有单元测试都像以前一样工作。
您认为通过定义移动构造函数 = 默认值会带来性能优势吗?
谢谢
解决方案
您认为通过定义移动构造函数 = 默认值会带来性能优势吗?
如果不研究代码库并运行一些基准测试,就无法预测这一点。可悲的是,它可能会对您的运行时性能产生积极影响。拥有一个= default
移动构造函数和移动赋值运算符,并且考虑到它们做正确的事情绝不是悲观的。可能发生的最糟糕的事情是您的数据成员不会从移动构造中受益(例如,您有一个std::array<int, 1000>
数据成员),然后您最终会像以前一样进行复制。
该项目遵循三原则
当您对代码进行现代化改造时,这会导致一致性问题。在 C++11 中,三法则现在是五法则。因此,如果您到现在为止都遵循三规则,您应该迁移到五规则以保持一致,除了您可能获得的运行时性能优势。
= default
手动设置移动构造函数是个好主意吗?
不,使用clang-tidy
的C.21检定让工具对你大喊大叫。
推荐阅读
- javascript - Vue JS 在渲染前等待数据
- python - 使用 aiohttp 流式传输 m4a
- selenium - 放心和硒集成
- excel - 获取最近一个月的 DAX 公式
- kiwi-tcms - 无法克隆测试用例 - 过滤计划在下一页打开
- android - 在 web 视图中呈现包含数学方程式的 HTML 数据
- php - 如何在moodle中向现有查询添加类似条件
- python - 如何从 Selenium webdriver Firefox 中的“driver.page_source”获取 HTTP 请求的原始 JSON 响应
- python - 在 django 中执行外部脚本的推荐做法是什么?
- swift - iOS:GMSPlacePickerViewController 国家限制