我有C#和obj-c的背景,所以RC/GC是我非常重视的东西。当我开始深入学习C++时,我不禁在想,既然普通指针是如此不受管理,为什么我要使用它们而不是其他替代方案呢?
shared_ptr提供了一种很好的方式来存储引用,而不会丢失跟踪它们而删除它们。我可以看到普通指针的实际应用,但它们似乎只是不良实践。
有人可以介绍一下这些替代方案吗?
我有C#和obj-c的背景,所以RC/GC是我非常重视的东西。当我开始深入学习C++时,我不禁在想,既然普通指针是如此不受管理,为什么我要使用它们而不是其他替代方案呢?
shared_ptr提供了一种很好的方式来存储引用,而不会丢失跟踪它们而删除它们。我可以看到普通指针的实际应用,但它们似乎只是不良实践。
有人可以介绍一下这些替代方案吗?
当然,如果它们是拥有指针,那么鼓励使用shared_ptr和unique_ptr。但是,如果你只需要一个观察者,那么裸指针就足够了(指向的对象不承担任何责任的指针)。
对于std::unique_ptr基本上没有额外开销,而std::shared_ptr会有一些开销,因为它为您执行引用计数,但在这里很少需要节省执行时间。
此外,如果可以通过设计保证生命周期/所有权层次结构,比如树中的父节点存活时间超过其子节点,那么就不需要“智能”指针了——尽管这与指针实际上是否拥有某个东西略有关系。
shared_ptr
(相比之下,你可以为所有东西使用GC管理的引用),因为这样做会导致你在不可避免地创建循环引用时感到惊讶。当你编写C++程序时,你必须考虑所有权问题。这并不是说你不应该使用它们(你应该使用),但选择正确的选项并不是一件轻而易举的事情。 - user395760shared_ptr
并使其超出范围会产生明显的开销,因为它需要原子操作(在最好的情况下)或锁定(在最坏的情况下)(标准保证这是线程安全的)。复制原始指针几乎没有任何操作。 - Damonjava.awt.Component.getSize()
返回的java.awt.Dimension
?) - James Kanze