簡體   English   中英

boost :: container :: small_vector似乎沒有就地分配

[英]boost::container::small_vector doesn't seem to allocate in-place

為了測試我對small_vector理解,我嘗試了以下示例程序,在該程序中,將向量模板small_vector就地大小為3,並使用10個元素填充向量。 我希望前3個元素可以就地存儲,而后7個元素可以在免費存儲中就地存儲,但是當我觀察內存布局時,情況似乎並非如此:與常規std::vector一樣,所有項目似乎都是連續且錯位存儲的。

我嘗試了各種編譯器(GCC和Clang的不同版本)和不同的Boost版本,但這似乎沒有什么不同。 以下代碼均未更改:

  • 將向量本身分配到免費商店中。
  • vec local之前和之后用大號本地vec包圍,然后才將其裝入元素。

有什么好的解釋嗎?

#include <iostream>
#include <boost/container/small_vector.hpp>

int main()
{
    auto vec = boost::container::small_vector<int, 3> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  

    for (const auto& num : vec)
    {
        std::cout <<
            "Index: " << num <<
            " Distance from vec[0]: " << (long)&num - (long)&vec[0] <<
            " Distance from vec: " << (long)&num - (long)&vec << "\n";
    }
}

輸出:

Index: 0 Distance from vec[0]: 0 Distance from vec: -140731961813152
Index: 1 Distance from vec[0]: 4 Distance from vec: -140731961813148
Index: 2 Distance from vec[0]: 8 Distance from vec: -140731961813144
Index: 3 Distance from vec[0]: 12 Distance from vec: -140731961813140
Index: 4 Distance from vec[0]: 16 Distance from vec: -140731961813136
Index: 5 Distance from vec[0]: 20 Distance from vec: -140731961813132
Index: 6 Distance from vec[0]: 24 Distance from vec: -140731961813128
Index: 7 Distance from vec[0]: 28 Distance from vec: -140731961813124
Index: 8 Distance from vec[0]: 32 Distance from vec: -140731961813120
Index: 9 Distance from vec[0]: 36 Distance from vec: -140731961813116
Index: 10 Distance from vec[0]: 40 Distance from vec: -140731961813112

參見: https : //wandbox.org/permlink/zMGRxHlM96Riq9Ky

增強文檔中

small_vector

small_vector是類似矢量的容器,針對包含少量元素的情況進行了優化。 它在原位包含一些預分配的元素,這使得它可以避免在元素的實際數量低於該預分配閾值時使用動態存儲分配。 small_vector的靈感來自LLVM的SmallVector容器。 與static_vector不同,small_vector的容量可能會超出初始的預分配容量。

small_vector可轉換為small_vector_base,這種類型與預分配的元素計數無關,從而允許不需要在該N參數上進行模板化的客戶端代碼。 small_vector繼承了所有vector的成員函數,因此它支持所有標准功能,例如放置,有狀態分配器等。

它說它的容量可以超過最初的容量,但是沒有說當容量增加時將使用初始存儲。

通常認為“向量”事物是連續的,並帶來許多好處。 (作為迭代器的原始指針,超快速隨機訪問等。)放棄這些好處以減少較小的動態內存使用(請記住是"small"_vector )不是一個好交易。

暫無
暫無

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

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