分层概述
一、栈:
通常是局部变量,函数参数等的存储区。声明为static的局部变量除外
二、堆:
动态分配的内存。像new和malloc就在该区域上申请内存空间。该区域内存的管理必须由程序写作者来负责,也就是如果通过new或malloc申请了一块内存,在程序结束时必须通过delete或free来释放相应的内存。new和delete的内容我后面会仔细说明。
因为该区域可以由用户来申请,申请大小视情况而定,通常很不一致,所以很容易造成该区域内存的碎片化。
三、全局区(静态区)
编译器编译时即分配内存。
- bss: 该区域存放未初始化的 全局变量和被声明为static的局部变量。。bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
- data: 存放已经初始化的 全局变量和被声明为static的局部变量
四、常量存储区
- rodata
常量字符串就是放在这里的。 程序结束后由系统释放。其中rodata区和text区在加载时会合并到一个段中,该段称为常量区,该区域的内容只允许读,不允许修改; - text:
也称为代码段(Code),text区保存程序编译链接后生成的机器代码。
举例详述
#include<iostream>
using namespace std;
const double pi=3.1415926; //常量: 存储在常量区
static int out=0; //静态全局变量: 已初始化,data区
int i=1; //初始化了的全局变量:已初始化,data区
int j; //未初始化的全局变量:未初始化,bss区
void func1()
{
static int count; //静态局部变量:未初始化,bss区
count++;
int i=count % 10; //局部变量:栈
cout<<"count % 10="<<i<<endl; //"count % 10="为字符串常量:常量区
}
void func2()
{
int i=0; //局部变量:栈
int *pi=&i; //局部变量:栈
*pi=*pi+1;
cout<<"i="<<i<<endl; //"i="为字符串常量:常量区
}
int main()
{
static int out=2; //静态局部变量:已初始化,data区
cout<<"out="<out<<endl;
func1();
func2();
return 0;
}