在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
这里有个问题:
为什么没有了bss、data和代码区?
反而多了自由存储区、全局/静态存储区、常量存储区。目前可以理解为是C++和C的区别。
- 栈。就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
- 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
- 自由存储区。就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
- 全局/静态存储区。全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的data区和未初始化的bss区,在C++里面没有这个区分了,他们共同占用同一块内存区。
- 常量存储区。这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
int a = 0; //静态存储区
char *p1; //静态存储区
const int data1; //若为全部变量:存储在静态存储区的只读数据段。
void main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456:常量存储区,p3:栈
static int c = 0; //静态存储区 !static无论是全局变量还是局部变量都存储在全局/静态区域!
p1 = new char[10]; //堆
p1 = "123456"; //123456:常量存储区,编译器将p1与p3所指向的"123456"优化成同一个地方
const int data2; //若为局部变量:写在栈中,代码块结束时释放。
}
Windows中以2:2划分内核、用户空间,Linux中以1:3划分内核、用户空间。
int gdata1 = 10; //.data 已初始化且初始化不为零的数据
int gdata2 = 0; //.bss 未初始化或初始化为零的数据
int gdata3; //.bss
static int gdata4 = 20; //.data
static int gdata5 = 0; //.bss
static int gdata6; //.bss
int main()
{
int data1 = 30; //.text //只有普通局部变量是指令
int data2 = 0; //.text
int data3; //.text
static int data4 = 40; //.data
static int data5 = 0; //.bss
static int data6; //.bss
return 0;
}
————————————————