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

c – 有没有办法通过在受控对象中存储引用计数来提高shared_ptr的效率?,第1张

概述这在我的代码中变成了一种常见的模式,因为当我需要管理一个需要非可复制的对象时,因为它是“重”或B.它是一个 *** 作系统资源,例如一个关键部分: class Resource;class Implementation : public boost::noncopyable{ friend class Resource; HANDLE someData; Implementa 这在我的代码中变成了一种常见的模式,因为当我需要管理一个需要非可复制的对象时,因为它是“重”或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那样高效,但值得考虑.

总结

以上是内存溢出为你收集整理的c – 有没有办法通过在受控对象中存储引用计数来提高shared_ptr的效率?全部内容,希望文章能够帮你解决c – 有没有办法通过在受控对象中存储引用计数来提高shared_ptr的效率?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存