2014-04-10 25 views
5

我正在閱讀關於raw_storage_iterator組件的TC++ PL。使用這個組件,我們可以獲得性能優勢,因爲它可以避免分配(更昂貴)並使用複製構造。它在我看來應該在序列/容器中使用,我們可以有大量元素,因此分配調用的次數可以產生很大的影響。什麼是raw_storage_iterator組件在C++中的使用/優點

從理論上講它很清晰,它在我看來這個組件對於容器類型類很有用。不過,我想了解我們應該在哪些地方使用這個組件(通過實際的例子)來獲得它的性能優勢?

+0

inb4「cplusplus.com很爛,你不敢鏈接它」;它在那裏說,它被使用,所以你可以使用未初始化的內存作爲算法的目的地。性能應該不會比使用後端插入器迭代器的保留向量更好。除非你編寫非常低級的代碼,否則你不需要這個迭代器。 – DanielKO

+0

@DanielKO帶有後端插入器迭代器的保留向量必須在每次插入時執行大小檢查。確定尺寸檢查不需要的編譯器相對不太可能。你會在支票上得到很好的分支預測,但它仍然會低於'raw_storage_iterator'的寫作。 – Yakk

回答

3

cppreference有示例代碼。

您可以通過多種機制分配未初始化內存的對齊塊。 Cppreferences使用std::get_temporary_buffer<T>來分配這樣一個緩衝區。

然後你可以製作一個指向這些元素的指針。指針的類型有點令人誤解,因爲它不是指向有效的指針,而是指向適合於構建T的內存塊。

std::raw_storage_iterator可填充該T*並告訴輸出到它。然後,您可以將該迭代器提供給期望傳統輸出迭代器的算法,並且順利進行。

如果您試圖在沒有raw_storage_iterator的情況下執行此操作,您將分配給未構造的T,這是未定義的行爲。作爲替代方案,您可以在輸出給它們之前構造T - 但這是浪費的,因爲它會構造對象兩次。

其基本思想是允許在標準算法中使用近乎完美的未初始化輸出緩衝區。除了一些嚴重的代碼微優化之外,這不是您應該使用的。

+0

難道這不是一個很好的地方使用安置新的替代呢? 這將使構造的對象一次進入保留空間。這仍然需要程序員獲得足夠的空間,但它似乎可能更好的性能和安全性。 – Paul

+0

@paul這個迭代器確實使用放置'new',只是它分配給它時才做它。原始存儲迭代器允許您將其作爲'std'某個算法的輸出 - 其中一些算法可能不想手動滾動。 – Yakk

相關問題