zoukankan      html  css  js  c++  java
  • c/c++ 标准容器 vector的内存空间是如何自动增长的

    c/c++ 标准容器 vector的内存空间是如何自动增长的

    vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作。

    vector的课题:由于容器的大小是可变的,当插入元素后,vector必须分配新的内存来保存已有元素和新的元素,将已有元素从旧的内存地址移动到新的内存地址,并释放掉旧的内存空间。如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,性能会慢到不可接受

    解决方案:为了避免这种代价,标准库实现者采用了可以减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string的实现通常会分配比新的要求空间更大的内存空间。容器预留这些空间备用,可用来保存更多的元素。这样,就不需要每次添加新元素都重新分配容器的内存空间了。

    有了上述的背景,就有了下面的函数:

    capacity 返回size + 预留空间的大小
    reserve(n) 分配至少能容纳n个元素的空间
    shrink_to_fit 将capacity()减少为为与size()相同大小
    #include <iostream>
    #include <vector>
    #include <string>
    #include <list>
    #include <forward_list>
    #include <deque>
    
    using namespace std;
    
    int main(){
      //下面代码展示了size和capacity之间的相互作用                                  
      vector<int> ivec;
      //size为0;capacity的值依赖于库的具体实现                                     
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
      //想ivec添加24个元素                                                          
      for(vector<int>::size_type i = 0; i != 24; ++i){
        ivec.push_back(i);
      }
      //size为24;capacity大于等于24                                                
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
      //用reserve预分配一些额外的空间                                               
      ivec.reserve(50);
      //size还是24;capacity大于等于50                                              
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
      //添加元素,用光多余容量                                                      
      while(ivec.size() != ivec.capacity()){
        ivec.push_back(0);
      }
      //size为50;capacity为50                                                      
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
      //再添加一个元素,vector就不得不重新分配空间                                  
      ivec.push_back(51);
      //size为51;capacity的值依赖于库的具体实现                                    
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
      //要求归还内存                                                                
      //shrink_to_fit只是一个请求,标准库并不保证退还内存                           
      ivec.shrink_to_fit();
      //size为51;capacity的值依赖于库的具体实现                                    
      cout << " ivec:size: " << ivec.size()
           << " capaciy: " << ivec.capacity() << endl;
    }
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    KVM之一:安装准备(基于CentOS6.7)
    Nginx技巧——Nginx/Apache下禁止指定目录运行PHP脚本(转自运维之美)
    (转)关于 awk 的 pattern(模式)
    form验证里使用request 和前端倒计时
    restful 在接口中获取 传过来的值
    django使用celery
    celery
    restful 在接口中获取 request.user
    码云创建一个仓库
    django中local_settings的配置
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9644441.html
Copyright © 2011-2022 走看看