两层方法传递shared_ptr<void>的最高效实现方案问询
最优实现方案
要实现高效传递std::shared_ptr<void>且调用者保留自身指针的机制,核心是避免不必要的引用计数操作,以下是最优构建方式:
关键选择理由
public方法参数:使用
const std::shared_ptr<void>&- 直接传递引用,不会触发
shared_ptr的复制构造(不会增加引用计数),避免无意义的开销。 - 符合调用者保留自身指针的需求,调用者无需放弃所有权。
- 直接传递引用,不会触发
private方法参数:同样使用
const std::shared_ptr<void>&- 私有方法仅被
give()调用,传递引用无需额外复制,进一步减少开销。 - 最终赋值给
m_data时,仅触发一次必要的复制构造(引用计数+1),这是类成员获取指针所有权的必须操作。
- 私有方法仅被
赋值操作:直接使用
m_data = data- 这一步是唯一的复制操作,完成类成员对指针的所有权获取,没有多余的移动或复制步骤。
完整代码实现
class Example{ public: void give(const std::shared_ptr<void>& data) { // 调用者保留自身shared_ptr,此处仅传递引用 m_give(data); } private: void m_give(const std::shared_ptr<void>& data) { // 仅执行一次必要的复制,将指针存入成员变量 m_data = data; } std::shared_ptr<void> m_data; };
备选优化场景(若允许调用者转移所有权)
如果后续需要支持调用者放弃指针所有权的场景,可以新增一个重载版本,利用右值引用和移动语义进一步优化:
public: // 原有保留所有权的版本 void give(const std::shared_ptr<void>& data) { m_give(data); } // 新增:调用者转移所有权的版本,零复制开销 void give(std::shared_ptr<void>&& data) { m_give(std::move(data)); } private: void m_give(const std::shared_ptr<void>& data) { m_data = data; } void m_give(std::shared_ptr<void>&& data) { // 移动语义转移所有权,无引用计数操作 m_data = std::move(data); }
这个重载版本中,调用者传递右值时,整个流程没有任何复制操作,仅通过移动语义转移所有权,是极致高效的方案。
内容的提问来源于stack exchange,提问作者Anne Quinn
相关产品推荐
相关产品推荐

