C 11 和Boost.Container 中的向量行為:處理未初始化的元素
在C 應用程式中,向量通常用作臨時緩衝區。為了確保足夠的容量,這些向量通常會進行大小調整操作。在 C 03 中,std::vector::resize() 函數透過附加指定值的副本來擴展向量。雖然此方法會初始化未使用的元素,但當僅考慮向量大小時,效率可能會很低。
C 11 引入了 resize() 的兩個重載:
- resize(size_type n):執行值未使用元素的初始化。
- resize(size_type n, const value_type & val):用副本初始化未使用的元素
Boost.Container 透過額外的重載進一步擴展了此功能:
- resize(size_type n, default_init_t):對未使用的元素執行預設初始化。
為了驗證這些函數的行為,使用C 11 進行了測試std::vector和boost::container::vector:
- 以值[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 填入向量。
- 刪除了一些元素以創建具有所需大小的向量[0, 1, 2, 3, 4].
- 使用不同的resize() 重載將向量大小調整為10個元素。
- 列印更新後的向量。
預期行為
對於 C 03 std::vector,未使用的元素應該用零初始化。 boost::container 變體預計在 C 03 模式下編譯時模擬 C 03 行為,並在 C 11 模式下編譯時表現出不同的行為。
實際結果
令人驚訝的是,測試結果顯示std::vector和boost::container::vector表現出相同的行為。在所有情況下,無論使用了 resize() 重載,未使用的元素都初始化為零。
解釋
這種意外行為表明 resize() 介面C 11 中引入的變更在給定場景中沒有實際效果。 C 03 std::vector::resize() 函式預設初始化未使用的元素。在 C 11 中,resize() 重載為明確初始化提供了附加選項,但它們不會改變預設初始化未使用元素的預設行為。 Boost.Container 實作中也反映了相同的行為。
意義
如果需要避免用零初始化未使用的元素,可以使用自訂分配器來攔截 std::allocator 的 construct() 方法並用預設初始化替換值初始化。但是,請謹慎行事,因為將其應用於所有初始化可能會導致意想不到的後果。
以上是C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何處理未初始化的元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!