C++常用容器在内存中的存储分析

本文以C++中常用的vector、set和map为例,分析其数据在内存中存储。

总结:

  1. vector、set和map容器其数据都是动态存储在堆空间的内存;
  2. 在栈区定义容器变量,变量本身存储在栈区,但是变量存储的数据在堆区;
  3. 在堆空间定义的容器变量,变量本身存储在堆区,存储的数据也在堆区;

例子:

struct  SQL{
  set<int> s;
  vector<int> v;
};//定义一个SQL类

  vector<int> v; //栈区定义vector变量v
  v.push_back(1);
  printf("v: %p\n", &v); //变量v的地址
  printf("v第一个元素:%p\n", &(v[0])); //变量v中第一个元素的存储地址
  printf("v第一个元素:%p\n", v.begin()); //也是第一个元素的存储地址

  set<int> s; //栈区定义set变量s
  s.insert(1);
  printf("s:%p\n", &s); //变量s的地址
  printf("s第一个元素:%p\n", s.begin()); //变量s中第一个元素的存储地址

  SQL* sql = new SQL(); //堆空间定义一个对象,该对象的成员变量将都定义在堆空间
  sql->s.insert(1);
  printf("sql->s: %p\n", &(sql->s)); //堆空间的对象的成员变量也在堆空间
  printf("sql->s第一个元素:%p\n", (sql->s).begin()); //set的数据在堆空间

  SQL sql1; //栈空间定义对象,该对象的成员变量也定义在栈
  sql1.s.insert(3);
  sql1.s.insert(4);
  printf("sql1.s: %p\n", &sql1.s);//成员变量在栈
  printf("sql1.s第一个元素:%p\n", sql1.s.begin());//set长成员变量的数据在堆
  printf("sql1.s第二个元素:%p\n", ++sql1.s.begin());

  /*
  v: 0x7fff6bcc3780
  v第一个元素:0xfee010
  v第一个元素:0xfee010
  s:0x7fff6bcc3700
  s第一个元素:0xfee030
  sql->s: 0xfee060
  sql->s第一个元素:0xfee0b0
  sql1.s: 0x7fff6bcc3730
  sql1.s第一个元素:0xfee0e0
  sql1.s第二个元素:0xfee110
   */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值