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

前端之家收集整理的这篇文章主要介绍了c – 在什么条件下我应该考虑实现移动构造函数和移动运算符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于标准的拷贝构造函数和赋值运算符,如果我的类实现了析构函数,我总是考虑实现它们或删除缺省的缺省值.

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

作为从前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,并且您还有一个可移动但不可复制的数据成员(因此也没有默认的复制构造函数).这就是移动在语义和性能上变得重要的时候.

原文链接:https://www.f2er.com/c/119899.html

猜你在找的C&C++相关文章