【发布时间】:2011-07-31 10:05:10
【问题描述】:
我一直在使用 pimpl 成语制作一些对象,但我不确定是使用 std::shared_ptr 还是 std::unique_ptr。
我知道std::unique_ptr 效率更高,但这对我来说不是什么大问题,因为这些对象无论如何都相对重量级,所以std::shared_ptr 相对于std::unique_ptr 的成本相对较小。
我目前使用std::shared_ptr 只是因为它具有额外的灵活性。例如,使用std::shared_ptr 允许我将这些对象存储在哈希图中以便快速访问,同时仍然能够将这些对象的副本返回给调用者(因为我相信任何迭代器或引用都可能很快变得无效)。
但是,在某种程度上,这些对象实际上并没有被复制,因为更改会影响所有副本,所以我想知道也许使用 std::shared_ptr 并允许复制是某种反模式或坏事。
这对吗?
【问题讨论】:
-
使用其中一种或另一种会深刻地改变您赋予对象的复制语义。两者都有用途。我想说的是 C++ 世界中更惯用的
unique_ptr,但是具有共享实现的对象有它们的用途,特别是如果您正在编写“外来”代码(例如 COM、C++/CLI),或者如果该类真的看起来像一个“引用类型”。 -
在 C++11 中推荐的方式是使用 unique_ptr,毕竟你不需要复制或与任何人共享实现。 unique_ptr 在运行时也更快。
标签: c++ c++11 shared-ptr pimpl-idiom unique-ptr