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

Ani*_*Ani 2 c++ memory boost vector heap-memory

为了测试我对 的理解small_vector,我尝试了下面的示例程序,其中我使用 3 的就地大小对向量进行模板化,并用 10 个元素填充向量。我希望前 3 个元素就地存储,而后 7 个元素在自由存储中就地存储,但当我观察内存布局时,情况似乎并非如此:所有的项目似乎都是连续和不合适地存储的,就像一个常规的std::vector.

我尝试了各种编译器(不同版本的 GCC 和 Clang)和不同的 Boost 版本,但这似乎没什么区别。以下代码也不会更改:

  • 在自由商店上分配向量本身。
  • vec前后用大型locals包围local,然后才加载元素。

对此有什么好的解释吗?

#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";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //wandbox.org/permlink/zMGRxHlM96Riq9Ky

ikh*_*ikh 5

提升文档中

small_vector

small_vector 是一个类似矢量的容器,针对包含很少元素的情况进行了优化。它包含一些就地预分配元素,当实际元素数量低于预分配阈值时,它可以避免使用动态存储分配。small_vector 的灵感来自 LLVM 的 SmallVector 容器。与 static_vector 不同,small_vector 的容量可以增长到超出初始预分配容量。

small_vector 可转换为 small_vector_base,这是一种独立于预分配元素计数的类型,允许客户端代码不需要在该 N 参数上进行模板化。small_vector 继承了 vector 的所有成员函数,因此它支持所有标准功能,例如放置、有状态分配器等。

它说它的容量可以增长到超出初始容量,但并没有说容量增长时会使用初始存储。

“矢量”事物通常被认为是连续的,它有很多好处。(原始指针作为迭代器、超高速随机访问等。)放弃这些好处来减少小的动态内存使用(记住是"small"_vector)不是一个好的交易。