是否有任何理由不使用pimpl在C++中实现移动支持?

显然,pimpl 并不是绝对必要的,但是如果课程是按照“正常”方式设计的,那么,似乎搬家不会给您带来全部预期的好处:搬家应该便宜;特别是,它应该比复制快得多;成本不应随着“真实”内部数据的数量而“扩大”。理想情况下,成本应该是 O(1)。

显然,如果您使用 pimpl,您每次都会以最少的努力和最大的可靠性获得这种速度优势(感谢= default)。那么,当您想要移动物体的能力时,是否有任何理由不只是在整个地方做 pimpl 呢?

(我假设您可以在应用程序中使用堆,因为这显然排除了 pimpl。)

回答

重要时移动比复制便宜 - 对于本身移动昂贵的类型,主要是由于内部分配堆内存,如 std::string 或 std::vector。复制一个具有 10 个“整数”的类,它无论如何都相对便宜,因此在该类型的类上进行更快的“移动”操作几乎没有什么好处。

虽然您认为 pimpl 在任何情况下都会加快移动速度是正确的,但它也为对象的创建(通过必须在堆上分配内部“pimpl”对象)和使用(现在有任何外部调用的额外间接访问)。我个人认为这不是仅仅为了使移动更快的原因而使用 pimpl 的原因 - 除非移动是您特定用例中的主要瓶颈。

就我个人而言,我宁愿反过来——如果你有一个非常大的对象,它只包含无法有效移动的“琐碎”类型,并且你希望对象快速移动,那么只需将对象存储在堆栈上(std ::unique_ptr)。这样,您就不会将 pimpl 的开销强加给该类的每个用户,同时在您需要时仍然可以快速移动。


以上是是否有任何理由不使用pimpl在C++中实现移动支持?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>