2017-10-18 65 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