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