簡體   English   中英

我應該從使用 boost::shared_ptr 切換到 std::shared_ptr 嗎?

[英]Should I switch from using boost::shared_ptr to std::shared_ptr?

我想使用-std=c++0x 0x 在 GCC 中啟用對 C++0x 的支持。 我不一定需要 GCC 4.5(以及很快 4.6)中當前支持的 C++11 功能,但我想開始習慣它們。 例如,在我使用迭代器的一些地方, auto類型會很有用。

但同樣,我不需要任何當前支持的功能。 這里的目標是鼓勵我將新標准的特性納入我的編程“詞匯表”。

根據您對 C++11 支持的了解,在 GCC 中啟用它是一個好主意,然后通過例如從使用boost::shared_ptr切換到std::shared_ptr來完全接受它,因為兩者不混合?

PS:我知道這個很好的問題,它比較了shared_ptr的不同風格,但我要求在標准最終確定之前使用更高級別的建議。 另一種說法是,當像 GCC 這樣的編譯器說它支持“實驗性功能”時,這是否意味着我在編譯過程中可能會遇到奇怪的錯誤,這將是主要的時間消耗和 StackOverflow 上神秘問題的來源?

編輯:我決定從std::shared_ptr切換回來,因為我只是不相信它在 GCC 4.5 中的支持,如this question中的示例所示

切換到std::shared_ptr有幾個原因:

  • 您刪除了對 Boost 的依賴。
  • 調試器。 根據您的編譯器和調試器,調試器可能對std::shared_ptr是“智能的”,並直接顯示指向 object 的位置,而不是說 boost 的實現。 至少在 Visual Studio 中, std::shared_ptr在調試器中看起來像一個普通的指針,而boost::shared_ptr則暴露了一堆 boost 的內部結構。
  • 您的鏈接問題中定義的其他新功能。
  • 您將獲得一個幾乎可以保證啟用移動語義的實現,這可能會節省一些引用計數修改。 (理論上——我自己沒有測試過)至少從 2014-07-22 開始, boost::shared_ptr理解移動語義。
  • std::shared_ptr在數組類型上正確使用delete [] ,而boost::shared_ptr在這種情況下會導致未定義的行為(您必須使用shared_array或自定義刪除器) (實際上我是正確的。看到這個- 專門針對僅unique_ptr ,而不是shared_ptr 。)

一個主要的明顯理由不:

  • 您將自己限制在 C++11 編譯器和標准庫實現中。

最后,您實際上不必選擇。 (如果您的目標是特定的編譯器系列(例如 MSVC 和 GCC),您可以輕松地將其擴展為使用std::tr1::shared_ptr (如果可用)。不幸的是,似乎沒有檢測 TR1 支持的標准方法)

#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif

我想這取決於你使用多少升壓。 我個人只非常謹慎地使用它(實際上是隨機數庫,在一個項目中)。 我最近開始在我的其他項目中使用-std=c++0x ,並且我在其中使用了新的 std:: 庫功能,例如 shared_ptr。 我喜歡我的項目具有最少的依賴關系,所以我寧願依賴編譯器的標准庫實現而不是 boost。

但我不認為這個問題有一個萬能的答案。

如果可用,您應該始終盡可能使用std::shared_ptr而不是 boost。 這基本上是因為所有使用shared_ptr的新接口都將使用標准共享 ptr。

在編譯器允許的情況下開始養成使用 std::shared_ptr 的習慣可能不是一個壞主意。 由於接口與 boost 的 shared_ptr 相同,因此如果需要,您可以隨時切換回來。

除了實現的一致性之外, boost::shared_ptr目前與std::shared_ptr相比至少保留了兩個利基優勢:

如果您只是在一個很好的平台上構建(進行切換)
(注意:您確實有單元測試來驗證向后兼容性,不是嗎?)

如果您在多個平台上編譯會變得有點尷尬,因為您需要驗證 g++ 4.5 上的功能在您使用的所有平台上都可用(即為 MAC/Linux 構建默認的 Mac g++ 編譯器仍然是幾個版本落后於 Linux 上的默認編譯器)。

切換到std::shared_ptr的另一個原因:它支持std::unique_ptr ,即具有構造函數。

boost::shared_ptr沒有。

我發現 std::shared_ptr 比 boost::shared_ptr 快。 我做了一個測試,你可以查看代碼並查看對比boost、Qt和std共享指針的餅圖結果。

在此處輸入圖像描述

https://www.osletek.com...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM