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的效率?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)