0

这个问题可能看起来有点基本,但是除了性能之外,智能指针还有什么缺点呢?我应该始终将它们用于非性能关键代码吗?

编辑:我使用 Visual Studio 2013 RC 和 C++11

4

2 回答 2

3

例如 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 中的改进。

于 2013-09-15T14:58:38.373 回答
3

我总是使用智能指针来保存资源,即使“智能”指针可能不那么智能,例如,在使用std::unique_ptr<T>or时std::unique_ptr<T[]>。当使用指针对非拥有链接进行建模或传递非拥有指针时,我使用的是原始指针,因为它们是这项工作的正确抽象,并且不会干扰关于对象如何拥有的任何选择。

于 2013-09-15T14:52:25.113 回答