【发布时间】:2016-12-11 04:02:09
【问题描述】:
我想使用类似指针的对象
Ownership<Type> m_foo
用于拥有对象和句柄
Reference<Type> m_someFoo
作为另一个上下文中的经典“指针”,而我的 Reference 应该知道原始对象何时不再存在(例如,通过返回 nullptr)并且还应该可以阻止原始对象从删除一小段时间(锁定)。
我知道 shared_ptr(所有权)和 weak_ptr(参考)提供类似的功能。但是,锁定 weak_ptr 并访问原始 ptr 需要创建一个相当慢的 shared_ptr。此外,我无法决定在访问原始 ptr 之前不锁定 weak_ptr(例如,在知道对象现在没有被删除的情况下)。
如下实现 Ownership 和 Reference 是否明智:
-
所有权知道其引用的地址(例如
std::list<Reference<Type>*>) - 当拥有的对象衰减时,这些References被设置为nullptr
-
引用在所有权中包含指向
uint m_lockCount的ptr - 锁定时,
m_lockCount++,解锁时m_lockCount-- -
所有权
m_lockCount != 0时无法释放对象
此解决方案对于少数Reference 实例和通过References 的高访问率特别可行。
【问题讨论】:
-
" 涉及创建一个相当慢的 shared_ptr"。知道为什么慢吗?当拥有的对象衰减时,这些引用被设置为nullptr,引用包含指向一个uint m_lockCount的ptr,在锁定时,m_lockCount++,在解锁时m_lockCount--,当m_lockCount!= 0时,所有权不能释放对象。另外,我打赌它比你想象的要快得多。
-
您所描述的一切正是
shared_ptr和weak_ptr旨在为您处理的内容。按原样使用它们,不要尝试手动复制它们。锁定weak_ptr确实会创建一个新的shared_ptr,但创建速度很快,因为它共享原始share_ptr的数据指针,并增加其引用计数,直到复制的shared_ptr超出范围。引用计数的重点是快速复制,并且在锁处于活动状态时不释放拥有的对象。 -
不要重新实现轮子。
-
如果你确实重新实现了轮子,请确保你的配置文件以确保你的改进确实是一种改进,并测试它的 bejeeebes 以确保你避免的减速不会做任何事情在你没有考虑过的边缘情况下很重要
-
为指针
Reference命名容器?您是因为简单地转换为prvalue而选择std::move的人吗?
标签: c++ shared-ptr dereference ownership weak-ptr