2017-10-18 38 views
1

我走过一段cpp的代码,并有以下问题(几乎没有接触到Boost库)升压使用情况make_shared

bool xxxx::calcYYY() 
    { 
     bool retStatus = false; 
     boost::shared_ptr<DblMatrix> price = boost::make_shared<DblMatrix>(xxx, xxx); 

..... 
      retStatus = true; 
     } 
     return retStatus; 
    } 

为什么实体化本地范围的指针作为共享?
在高性能代码中,必须有额外的开销来维护引用计数。
这里正确地做到这一点的助推替代方法是什么?

+2

没有看到更多的功能,我们怎么能确切地告诉你?指针是否传递给其他函数?其中一个可能是调用别的东西,那个股权?我们不知道。 – StoryTeller

+0

没有足够的上下文来说什么。什么是'xxx'和'xxx'? '.....'会发生什么? –

+0

是存储在某个地方的价格,还是仅仅用于倾销?如果它很大并存储在某个地方供以后多个使用者使用,那么shared_ptr是适当的。如果它被使用一次并立即销毁,那么你可以简单地将它构建在堆栈上。 –

回答

0

为什么本地作用域指针实例化为共享?

因为它们指向可以共享的对象。例如,可以将它们传递给可以延长它们引用的对象的生命周期的函数。

在高性能代码中必须有额外的开销来维护引用计数。

可能。编译器也可以优化它。有很多技巧,例如通过const引用传递指针以避免必须更改引用计数,在可能的情况下使用std::move等等,这可以使许多用例的额外开销可以忽略不计。但是,据推测,它正在被使用,因为有一些好处。我们无法仅仅说明你所显示的代码。

在这里正确地做到这一点的助推替代方法是什么?

没有任何不正确的显示。

0

为什么本地作用域指针实例化为共享?

因为作者想使用智能指针,即使函数通过提前返回或异常退出,也可以保证内存被释放。

最佳选择这种用法是std::unique_ptr,但这不是可用,直到C++ 11,如果原来的代码早,它不会是一个选项。

下一个最佳选择是boost::unique_ptr。这实际上完美地处理了这种情况,但它通常比std::unique_ptr更有用,因为它不支持移动语义。因此,一般规则“只使用boost::shared_ptr并停止担心”是非常明智的(特别是如果您要将指针传递给可能需要重新分配的通用函数)。

也有std::auto_ptr它也处理这种情况下,但它会导致任何人阅读代码去“挂,这是OK”。最好避免。

在高性能代码中必须有额外的开销来维护引用计数。

如果指针被分配一次,然后从未使用直到它被释放,那么单位递增和递减的原子的成本要在通话的噪声输给newdelete