QVector的内存分配策略

本文详细分析了QVector的内存分配策略,指出在QVector满容量后,内存按照2^n的方式增长。与std::vector不同的是,QVector在内存分配时会考虑到内存对齐和额外的QArrayData头信息,导致实际容量与数据容量存在差异。通过示例代码展示了QVector和std::vector在扩容时的内存差异,引发对两者优劣的思考。
摘要由CSDN通过智能技术生成
我们都知道 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 所分配的内存被填满时,它的内存又是以何种方式扩充的呢?我们可以
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值