加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在什么条件下我应该考虑实现移动构造函数和移动运算符?

发布时间:2020-12-16 04:52:05 所属栏目:百科 来源:网络整理
导读:对于标准的拷贝构造函数和赋值运算符,如果我的类实现了析构函数,我总是考虑实现它们或删除缺省的缺省值. 对于新移动构造函数和移动运算符,考虑是否需要实现的正确方法是什么? 作为从前C 0x转换系统的第一步,我可以删除默认的移动构造函数并移动运算符,还是
对于标准的拷贝构造函数和赋值运算符,如果我的类实现了析构函数,我总是考虑实现它们或删除缺省的缺省值.

对于新移动构造函数和移动运算符,考虑是否需要实现的正确方法是什么?

作为从前C 0x转换系统的第一步,我可以删除默认的移动构造函数并移动运算符,还是应该让它们单独存在?

解决方法

您无需担心它,因为当您用户声明析构函数(或12.8 / 9中列出的任何其他内容)时,会阻止生成默认移动构造函数.因此,与副本的风险不同,默认是错误的.

所以,作为第一关,让他们独自一人.在现有代码中可能存在C 11移动语义允许移动的位置,而C 03指示副本.你的课程将继续被复制,如果这在C 03中没有引起任何性能问题,那么我无法立即想到为什么它会在C 11中出现.如果它确实导致了C 03中的性能问题,那么你就有机会修复你以前从未到过的代码中的错误,但这是一个机会,而不是义务;-)

如果您稍后实施移动构造和分配,它们将被移动,特别是如果您认为您班级的C 11客户端不太可能使用“交换优化”来避免副本,那么您将希望这样做,更有可能通过你的类型,价值等,比C 03客户.

在C 11中编写新类时,您需要根据您考虑的相同标准考虑并实现移动,并在C 03中实现交换.可以复制的类实现C 11概念“可移动”,(就像一个类一样)可以在C 03中复制的可以通过std中的默认实现进行交换,因为“可移动”并没有说明源所处的状态 – 特别是它允许不变.所以副本作为一个移动是有效的,它不一定是有效的,并且对于许多类,你会发现,与“好”移动或交换不同,副本可以抛出.

您可能会发现,如果您有析构函数(因此没有默认的移动构造函数),您必须为您的类实现move,并且您还有一个可移动但不可复制的数据成员(因此也没有默认的复制构造函数).这就是移动在语义和性能上变得重要的时候.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读