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那样高效,但值得考虑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |