2015-07-05 26 views
6

我讀上DirectXMath文檔,並在接下來的通道偶然:如何shared_ptr的破壞比對

作爲替代你的C++類直接執行對準通過 超載新/刪除,你可以使用pImpl習語。如果你確保你的 實現類是通過__aligned_malloc內部實現中內部排列,可以 然後自由使用對齊類型。這 是一個很好的選擇,當「公」類是Windows運行時參考 類或旨在與的std :: shared_ptr的<>,它可以否則 破壞精心調整使用。

我不明白shared_ptr如何在對齊策略中做任何改變,它只有一個指針,它沒有分配一個對象。

+0

我同意。在我看來,文檔已經過時了。在C++ 11中,您可以通過屬性指定數據類型的對齊方式。 –

回答

10

你說得對,std::shared_ptr不影響定向。它只需要一個指向已經分配的對象的指針,所以如果這個分配導致了一個未對齊的對象,問題不在於std::shared_ptr,這是與該分配。

std::shared_ptr經常與std::make_shared使用。 std::make_shared<T>執行單一分配以爲std::shared_ptr控制結構和T實例保留內存。這種分配不使用任何類別的operator new(而不應該)。如果類特定的operator new設置比默認分配器更嚴格的對齊方式,那麼很容易看出默認分配器被使用時這會失敗。

+1

此外,即使operator new使用16字節對齊方式(例如使用x64 native),標準也不要求使用「std :: make_shared」分配的額外空間尊重類的對齊方式本身。 –

+0

花了我一個小時的調試,終於找到罪魁禍首。謝謝! – rwols