我们都知道 STL std::vector 作为动态数组在所分配的内存被填满时,如果继续添加数据,std::vector 会另外申请一个大小当前容量两倍的区域(如果 n > size 则申请 n+当前容量 的空间),然后把当前内容拷贝到新的内存,以达到动态扩容的效果:
size_type
_M_check_len(size_type __n, const char* __s) const
{
if (max_size() - size() < __n)
__throw_length_error(__N(__s));
const size_type __len = size() + std::max(size(), __n);
return (__len < size() || __len > max_size()) ? max_size() : __len;
}
最直观的方式是写个客户程序看看:
vector<int> ve(4, 8);
cout << "size : " << ve.size() << " capacity : " << ve.capacity() << endl;
for ( int i = 0; i < 14; ++i )
{
ve.push_back(9);
ve.push_back(0);
cout << "size : " << ve.size() << " capacity : " << ve.capacity() << endl;
}
输出如下,capacity 每次扩张为之前容量的两倍:
类似的,Qt在其 QTL 中也实现了类似的QVector,为了更方便地服务为 Qt 应用服务,它提供了隐式共享,写时复制等机制,并同时提供了 Java Style 和 C++ Style 的接口,相同功能的接口也就是换了个名字而已:
inline void push_back(const T &t) { append(t); }
那么,
在 QVector 所分配的内存被填满时,它的内存又是以何种方式扩充的呢?我们可以