我一直在使用 pimpl 习惯用法制作一些对象,但我不确定是否使用std::shared_ptr http://en.cppreference.com/w/cpp/memory/shared_ptr or std::unique_ptr http://en.cppreference.com/w/cpp/memory/unique_ptr.
我明白那个std::unique_ptr
效率更高,但这对我来说并不是什么大问题,因为这些对象无论如何都是相对重量级的,所以成本std::shared_ptr
over std::unique_ptr
是相对较小的。
我目前正在与std::shared_ptr
只是因为额外的灵活性。例如,使用std::shared_ptr
允许我将这些对象存储在哈希图中以便快速访问,同时仍然能够将这些对象的副本返回给调用者(因为我相信任何迭代器或引用可能很快就会变得无效)。
然而,这些对象在某种程度上确实没有被复制,因为更改会影响所有副本,所以我想知道也许使用std::shared_ptr
允许复制是某种反模式或坏事。
它是否正确?
我一直在使用 pimpl 习惯用法制作一些对象,但我不确定是否使用shared_ptr
or unique_ptr
.
确实unique_ptr
or scoped_ptr
.
Pimpl
不是一种模式,而是一种习惯用法,它处理编译时依赖性和二进制兼容性。它不应该影响对象的语义,特别是在其复制行为方面。
您可以在幕后使用您想要的任何类型的智能指针,但这两个保证您不会意外地在两个不同的对象之间共享实现,因为它们需要对复制构造函数和赋值运算符的实现有意识的决定。
然而,这些对象在某种程度上确实没有被复制,因为更改会影响所有副本,所以我想知道也许使用shared_ptr
允许复制是某种反模式或坏事。
它不是一种反模式,事实上,它是一种模式:别名。您已经在 C++ 中通过裸指针和引用使用了它。shared_ptr
提供额外的“安全”措施来避免死引用,但代价是额外的复杂性和新问题(小心造成内存泄漏的循环)。
与Pimpl无关
我明白unique_ptr
效率更高,但这对我来说并不是什么大问题,因为这些对象无论如何都是相对重量级的,所以成本shared_ptr
over unique_ptr
是相对较小的。
如果您可以分解出某些状态,您可能需要查看蝇量级 http://www.vincehuston.org/dp/flyweight.html图案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)