这个问题可能看起来有点基本,但是除了性能之外,智能指针还有什么缺点呢?我应该始终将它们用于非性能关键代码吗?
编辑:我使用 Visual Studio 2013 RC 和 C++11
这个问题可能看起来有点基本,但是除了性能之外,智能指针还有什么缺点呢?我应该始终将它们用于非性能关键代码吗?
编辑:我使用 Visual Studio 2013 RC 和 C++11
例如 a unique_ptr
,任何合理的优化编译器都不可能有任何性能下降。因为shared_ptr
你可能有一个额外的堆分配——你可以用 解决这个问题make_shared
,并且有维护引用计数的成本,但考虑到如果你正在滚动自己的跟踪或生命周期管理机制,你可能也会承担这种开销。有关此问题的更多讨论,请参见GotW #89。
关于“我应该一直使用它们”,Sean Parent 在 GoingNative 2013 演讲C++ Seasoning中阐述了这一点(以及一些微妙之处) ——他的第三个目标是“没有原始指针”,他给出了一些例子。有一次他提出 shared_ptr-to-non-const 几乎等同于全局变量……值得一看。可以使用C++ 调味幻灯片,但我建议您观看。
一般来说,每个智能指针都会有权衡,就像原始指针有权衡一样。这将取决于您评估情况和权衡并做出选择。而且似乎有足够多的经过严格审查的智能指针变体来匹配当今许多(如果不是大多数)情况,尤其是在 C++11 和 C++14 中的改进。
我总是使用智能指针来保存资源,即使“智能”指针可能不那么智能,例如,在使用std::unique_ptr<T>
or时std::unique_ptr<T[]>
。当使用指针对非拥有链接进行建模或传递非拥有指针时,我使用的是原始指针,因为它们是这项工作的正确抽象,并且不会干扰关于对象如何拥有的任何选择。