本文以C++中常用的vector、set和map为例,分析其数据在内存中存储。
总结:
- vector、set和map容器其数据都是动态存储在堆空间的内存;
- 在栈区定义容器变量,变量本身存储在栈区,但是变量存储的数据在堆区;
- 在堆空间定义的容器变量,变量本身存储在堆区,存储的数据也在堆区;
例子:
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
*/