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)
在提升文档中,
small_vector
small_vector 是一个类似矢量的容器,针对包含很少元素的情况进行了优化。它包含一些就地预分配元素,当实际元素数量低于预分配阈值时,它可以避免使用动态存储分配。small_vector 的灵感来自 LLVM 的 SmallVector 容器。与 static_vector 不同,small_vector 的容量可以增长到超出初始预分配容量。
small_vector 可转换为 small_vector_base,这是一种独立于预分配元素计数的类型,允许客户端代码不需要在该 N 参数上进行模板化。small_vector 继承了 vector 的所有成员函数,因此它支持所有标准功能,例如放置、有状态分配器等。
它说它的容量可以增长到超出初始容量,但并没有说容量增长时会使用初始存储。
“矢量”事物通常被认为是连续的,它有很多好处。(原始指针作为迭代器、超高速随机访问等。)放弃这些好处来减少小的动态内存使用(记住是"small"_vector
)不是一个好的交易。