[英]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
有幾個原因:
std::shared_ptr
是“智能的”,並直接顯示指向 object 的位置,而不是說 boost 的實現。 至少在 Visual Studio 中, std::shared_ptr
在調試器中看起來像一個普通的指針,而boost::shared_ptr
則暴露了一堆 boost 的內部結構。boost::shared_ptr
理解移動語義。std::shared_ptr
在數組類型上正確使用delete []
,而boost::shared_ptr
在這種情況下會導致未定義的行為(您必須使用shared_array
或自定義刪除器)unique_ptr
,而不是shared_ptr
。)一個主要的明顯理由不:
最后,您實際上不必選擇。 (如果您的目標是特定的編譯器系列(例如 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
相比至少保留了兩個利基優勢:
boost::make_shared_noinit
的可用性。 它與 arrays 結合使用特別有用,可以避免零初始化的成本和單獨分配的開銷。 (FWIW,它也是該標准的擬議補充。)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共享指針的餅圖結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.