有人知道如何传递 boost::shared_ptr
- 通过值或引用?
在我的平台上(32位),sizeof(shared_ptr)
为8个字节,看起来应该通过引用传递它们,但也许有人有另一种观点/进行了配置文件/类似的东西吗?
有人知道如何传递 boost::shared_ptr
- 通过值或引用?
在我的平台上(32位),sizeof(shared_ptr)
为8个字节,看起来应该通过引用传递它们,但也许有人有另一种观点/进行了配置文件/类似的东西吗?
尽可能使用shared_ptr的引用,这是因为shared_ptr的操作是原子的,因此开销异常高,并且在增量/减量上可能会出现缓存未命中的情况,如果调用函数仍然具有对象的强引用,则这并不是必要的。
当然,这并非总是可行的-例如,在容器或成员变量中,它们需要持有自己的引用。
正如另一个回答者所说,在C++中任何开销的绝大部分都在构造函数/析构函数中,而不是传递原始位和字节。对于shared_ptr也是如此。
我会通过引用传递 shared_ptr
的方式来传递它。如果你通过值传递,使用计数会在进入函数时增加,在离开函数时减少,这是不必要的开销。
我认为 shared_ptr 的本质是它是一个对象,应该通过值传递。据我回忆,它使用构造函数和析构函数自动处理引用计数,因此它知道何时释放指针。
每当我使用它时,我都会通过值传递。
boost::shared_ptr
是一个对象(应该通过 const & 传递)。
boost::shared_ptr
模拟指针,应该像指针一样处理。
当您不确定指针类型是否会保持不变时。也就是说,如果您考虑在将来的某个时候在代码库中用T*
替换shared_ptr<T>
,那么编写typedef shared_ptr<T> TPtr;
并将函数定义为void yourfunction(TPtr value)
是有意义的。
在这种情况下,当您更改指针类型时,您只需要修改typedef
行。
当您在两个具有不同生命周期的模块之间共享指针时。在这种情况下,您需要确保有两个智能指针实例,并且两者都增加指针的引用计数。
在其他情况下,这是一种偏好问题(除非您正在编写性能关键代码,在这种情况下应遵循不同的规则)。
shared_ptr
,那么它一开始就没有成为shared_ptr
的意义。然后你可以完全摆脱引用计数器。如果你几乎从不想增加/减少引用计数器,你应该考虑为什么要使用引用计数智能指针。因此,也许我的观点不是“默认按值传递”,而是“默认使用另一种智能指针类型,并在需要引用计数器时回退到shared_ptr
(这是因为你需要存储多个副本,所以按值传递是有意义的)”。 - jalf