You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两层方法传递shared_ptr<void>的最高效实现方案问询

最优实现方案

要实现高效传递std::shared_ptr<void>且调用者保留自身指针的机制,核心是避免不必要的引用计数操作,以下是最优构建方式:

关键选择理由

  1. public方法参数:使用const std::shared_ptr<void>&

    • 直接传递引用,不会触发shared_ptr的复制构造(不会增加引用计数),避免无意义的开销。
    • 符合调用者保留自身指针的需求,调用者无需放弃所有权。
  2. private方法参数:同样使用const std::shared_ptr<void>&

    • 私有方法仅被give()调用,传递引用无需额外复制,进一步减少开销。
    • 最终赋值给m_data时,仅触发一次必要的复制构造(引用计数+1),这是类成员获取指针所有权的必须操作。
  3. 赋值操作:直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:54:27