Ale*_*lex 4 c++ shared-ptr unique-ptr
我有C#和obj-c的背景,所以RC/GC是我(仍然)对我持有的东西.当我开始更深入地学习C++时,我不禁想知道为什么当它们如此不受管理而不是其他替代解决方案时我会使用普通指针?
在shared_ptr的提供存储参考,不失去对它们的跟踪而不删除它们的好方法.我可以看到正常指针的实用方法,但它们似乎只是不好的做法.
有人可以提出这些替代方案吗?
Sca*_*nth 11
当然,如果他们拥有指针,你会被鼓励使用共享和独特的ptr.但是,如果你只需要一个观察者,一个原始指针就可以了(指针对它指向的任何东西都不负责).
基本没有开销,std::uniqe_ptr
并且有一些内容,std::shared_ptr
因为它为您引用计数,但很少需要在此处节省执行时间.
此外,如果您可以通过设计保证生命/所有权层次,则不需要"智能"指针; 说一个树中的父节点比其子节点更长 - 虽然这与指针实际上是否拥有某些东西的事实有些关系.
问题恰恰相反:为什么要使用智能指针?与C#(我认为Obj-C)不同,C++广泛使用了值语义,这意味着除非对象具有特定于应用程序的生命周期(在这种情况下,没有智能指针适用),您通常会使用值语义,没有动态分配.有一些例外,但如果你从价值语义(例如喜欢int
)的角度思考它
,在必要时定义适当的复制构造函数和赋值运算符,而不是动态分配,除非对象具有外部定义的生命周期,你将会发现你很少需要做更多的事情; 一切都只是照顾好自己.在大多数编写良好的C++中,使用智能指针是个例外.
正如其他人提到的,在C++中你必须考虑所有权.话虽这么说,我正在研究的3D联网多人FPS有一个名为"No new or delete"的官方规则.它只使用共享和唯一指针来指定所有权,并从它们(使用.get()
)中检索的原始指针,我们需要与C API进行交互.性能影响不明显.我以此为例来说明可以忽略不计的性能,因为游戏/模拟通常具有最严格的性能要求.
这也显着减少了调试和追踪内存泄漏所花费的时间.从理论上讲,精心设计的应用程序永远不会遇到这些问题.然而,在现实生活中使用设计不当的截止日期,遗留系统或现有游戏引擎,它们是游戏等大型项目的必然性......除非你使用智能指针.如果您必须动态分配,没有足够的时间来设计/重写体系结构或调试与资源管理相关的问题,并且您希望尽快将其发布到现场,那么智能指针是可行的方式即使在大型游戏中也会有明显的性能成本.