C++ 向量减少分配大小
C++ vector reduce allocation size
C++ 向量在实践中什么时候动态减少其分配的大小。
我知道分配的 space 在插入完整向量时加倍,但我不清楚分配何时减少。经典滞后是在从 1/4 满向量中移除时将分配大小减半。
如果没有明确指示,它永远不会缩小分配的内存。
在 C++11 中有一个 shrink_to_fit
调用会要求实现执行此操作,但它可能不会减少分配的内存。在以前的版本中,您必须创建一个新副本并交换旧副本。
至少在我的编译器中,向量似乎不会减少它们分配的空间 space。
当我 运行:
std::vector<int> v;
for(unsigned x=0;x<20;++x)
{
v.push_back(x);
out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
}
for(unsigned x=v.size();x>0;--x)
{
v.pop_back();
out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
}
返回的是:
elements: 1, capacity: 1
elements: 2, capacity: 2
elements: 3, capacity: 4
elements: 4, capacity: 4
elements: 5, capacity: 8
elements: 6, capacity: 8
elements: 7, capacity: 8
elements: 8, capacity: 8
elements: 9, capacity: 16
elements: 10, capacity: 16
elements: 11, capacity: 16
elements: 12, capacity: 16
elements: 13, capacity: 16
elements: 14, capacity: 16
elements: 15, capacity: 16
elements: 16, capacity: 16
elements: 17, capacity: 32
elements: 18, capacity: 32
elements: 19, capacity: 32
elements: 20, capacity: 32
elements: 19, capacity: 32
elements: 18, capacity: 32
elements: 17, capacity: 32
elements: 16, capacity: 32
elements: 15, capacity: 32
elements: 14, capacity: 32
elements: 13, capacity: 32
elements: 12, capacity: 32
elements: 11, capacity: 32
elements: 10, capacity: 32
elements: 9, capacity: 32
elements: 8, capacity: 32
elements: 7, capacity: 32
elements: 6, capacity: 32
elements: 5, capacity: 32
elements: 4, capacity: 32
elements: 3, capacity: 32
elements: 2, capacity: 32
elements: 1, capacity: 32
elements: 0, capacity: 32
在 C++11 之前,您可以通过为它分配一个新值来清空向量:
vector<int> x;
x.resize(500);
x = vector<int>(); // assigning a copy of new empty vector will shrink memory usage
C++ 向量在实践中什么时候动态减少其分配的大小。
我知道分配的 space 在插入完整向量时加倍,但我不清楚分配何时减少。经典滞后是在从 1/4 满向量中移除时将分配大小减半。
如果没有明确指示,它永远不会缩小分配的内存。
在 C++11 中有一个 shrink_to_fit
调用会要求实现执行此操作,但它可能不会减少分配的内存。在以前的版本中,您必须创建一个新副本并交换旧副本。
至少在我的编译器中,向量似乎不会减少它们分配的空间 space。 当我 运行:
std::vector<int> v;
for(unsigned x=0;x<20;++x)
{
v.push_back(x);
out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
}
for(unsigned x=v.size();x>0;--x)
{
v.pop_back();
out << "elements: " << v.size() << ", capacity: " << v.capacity() << std::endl;
}
返回的是:
elements: 1, capacity: 1
elements: 2, capacity: 2
elements: 3, capacity: 4
elements: 4, capacity: 4
elements: 5, capacity: 8
elements: 6, capacity: 8
elements: 7, capacity: 8
elements: 8, capacity: 8
elements: 9, capacity: 16
elements: 10, capacity: 16
elements: 11, capacity: 16
elements: 12, capacity: 16
elements: 13, capacity: 16
elements: 14, capacity: 16
elements: 15, capacity: 16
elements: 16, capacity: 16
elements: 17, capacity: 32
elements: 18, capacity: 32
elements: 19, capacity: 32
elements: 20, capacity: 32
elements: 19, capacity: 32
elements: 18, capacity: 32
elements: 17, capacity: 32
elements: 16, capacity: 32
elements: 15, capacity: 32
elements: 14, capacity: 32
elements: 13, capacity: 32
elements: 12, capacity: 32
elements: 11, capacity: 32
elements: 10, capacity: 32
elements: 9, capacity: 32
elements: 8, capacity: 32
elements: 7, capacity: 32
elements: 6, capacity: 32
elements: 5, capacity: 32
elements: 4, capacity: 32
elements: 3, capacity: 32
elements: 2, capacity: 32
elements: 1, capacity: 32
elements: 0, capacity: 32
在 C++11 之前,您可以通过为它分配一个新值来清空向量:
vector<int> x;
x.resize(500);
x = vector<int>(); // assigning a copy of new empty vector will shrink memory usage