gpt4 book ai didi

c++ - 在什么情况下我应该考虑实现移动构造函数和移动运算符?

转载 作者:可可西里 更新时间:2023-11-01 18:19:08 25 4
gpt4 key购买 nike

对于标准的复制构造函数和赋值运算符,如果我的类实现了析构函数,我总是考虑实现它们或删除默认值。

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

作为从 C++0x 之前的系统转换系统的第一步,我是否可以删除默认的移动构造函数移动运算符 还是我应该让他们一个人呆着?

最佳答案

不必担心它,因为当您用户声明析构函数(或 12.8/9 中列出的任何其他内容)时,会阻止默认移动构造函数被产生。因此,不存在与拷贝相同的风险,默认值是错误的。

所以,作为第一遍,让他们一个人呆着。在您现有代码中的某些地方,C++11 移动语义允许移动,而 C++03 规定了一个拷贝。你的类将继续被复制,如果这在 C++03 中没有导致性能问题,那么我不能立即想到它在 C++11 中会出现的任何原因。如果它确实导致了 C++03 中的性能问题,那么您就有机会修复您的代码中以前从未遇到过的错误,但这是一个机会,而不是义务;-)

如果您稍后实现移动构造和赋值,它们将被移动,特别是如果您认为您的类的 C++11 客户端不太可能使用“swaptimization”来避免复制,您将希望这样做,比 C++03 客户端更有可能按值传递类型等。

在 C++11 中编写新类时,您需要根据在 C++03 中考虑和实现 swap 的相同标准来考虑和实现移动。可以复制的类实现了 C++11 的“可移动”概念,(就像 C++03 中可以复制的类可以通过 std 中的默认实现进行交换),因为“可移动”并没有说明源处于什么状态——特别是允许它保持不变。所以拷贝有效的移动,它不一定是有效的,对于许多类,您会发现与“好”移动或交换不同,拷贝可以抛出。

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

关于c++ - 在什么情况下我应该考虑实现移动构造函数和移动运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com