加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 有没有办法通过在受控对象中存储引用计数来提高shared_ptr

发布时间:2020-12-16 10:39:27 所属栏目:百科 来源:网络整理
导读:这在我的代码中变成了一种常见的模式,因为当我需要管理一个需要非可复制的对象时,因为它是“重”或B.它是一个操作系统资源,例如一个关键部分: class Resource;class Implementation : public boost::noncopyable{ friend class Resource; HANDLE someData;
这在我的代码中变成了一种常见的模式,因为当我需要管理一个需要非可复制的对象时,因为它是“重”或B.它是一个操作系统资源,例如一个关键部分:

class Resource;

class Implementation : public boost::noncopyable
{
    friend class Resource;
    HANDLE someData;
    Implementation(HANDLE input) : someData(input) {};
    void SomeMethodThatActsOnHandle() {
        //Do stuff
    };
public:
    ~Implementation() { FreeHandle(someData) };
};

class Resource
{
    boost::shared_ptr<Implementation> impl;
public:
    Resource(int argA) explicit {
        HANDLE handle = 
            SomeLegacyCApiThatMakesSomething(argA);
        if (handle == INVALID_HANDLE_VALUE)
            throw SomeTypeOfException();
        impl.reset(new Implementation(handle));
    };
    void SomeMethodThatActsOnTheResource() {
        impl->SomeMethodThatActsOnTheHandle();
    };
};

这样,shared_ptr处理引用计数问题,允许资源可复制,即使基础句柄只有在销毁所有引用后才能关闭.

但是,似乎我们可以节省分配shared_ptr的引用计数的开销,如果我们可以在某种程度上将这些数据移动到Implementation中,就像boost的侵入式容器那样.

如果这使得过早的优化讨厌唠叨某些人,我实际上同意我不需要这个用于我当前的项目.但我很好奇是否有可能.

解决方法

部分解决方案是使用make_shared创建shared_ptrs.例如,

auto my_thing = std::make_shared<Thing>();

代替

auto my_thing = std::shared_ptr<Thing>(new Thing);

它仍然是非侵入性的,所以没有其他东西需要改变. make_shared的良好实现结合了引用计数的内存分配和对象本身.这样可以节省内存分配并使计数靠近对象以获得更好的局部性.它不像boost:intrusive_ptr那样高效,但值得考虑.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读