C++内存区域
程序由代码和数据组成,其中代码存储在代码区中,数据根据类型的不同存储在不同的区域中,C++中可分为全局/静态区、常量数据区、栈区和堆区等。
1、 全局/静态区及常量数据区
该存储区主要用于存储全局变量、静态变量以及字符串常量等。在程序编译阶段已经分配完毕。且字符串常量存储区是不可修改的内存区域。
2、 栈区
栈区用于存储函数内部的局部变量或者函数参数等。该部分内存在进入其所属的作用域时由该区域的栈统一分配,并在退出该区域时自动释放。
3、 堆区
堆区用于存放开发人员动态申请的空间(通过malloc/new等函数)。该区中分配的空间必须通过开发人员显示回收(通过free/delete等函数)。
4、 栈区与堆区的比较
1、 分配和释放
栈区的内存由系统自动分配与释放,而堆区的内存由开发人员动态分配和回收。
2、 大小
一个程序使用栈的大小时固定的,由编译器决定,且比较小,Visual Studio 2003下栈的默认大小为1M。虽然可以通过编译器选项来指定栈的大小,但通常不会太大。而堆的大小一般只受限于有效虚拟内存的大小,因此可以用来肥胖占用内存较大的对象或数据。
3、 效率
由于栈的内存由系统自动分配,压栈和出栈都有相应的指令,故效率较高,且分配的内存空间是连续的,不会产生内存碎片;而堆是动态分配的需要根据算法寻找合适的内存,故效率较低;另外,程序运行过程中,栈一般是常驻内存的,而堆一般是不常驻内存的。
验证程序:
#include <iostream>
using namespace std;
int nGlobal = 100; /*全局变量*/
int main()
{
static int nLocalStatic = 100; /*静态变量*/
int nLocal = 10; /*局部变量*/
const int nLocalConst = 20; /*局部常量*/
char localArray[16] = "LocalArray"; /*局部数组*/
char *pLocalString1 = "LocalString1"; /*指向字符串常量的指针变量*/
const char *pLocalString2 = "LocalString2"; /*指向字符串常量的指针常量*/
int * pNew = new int[32]; /*new动态申请*/
char *pMalloc = (char *)malloc(sizeof(char) * 16); /*malloc动态申请*/
/*全局变量、静态变量*/
printf("global variable : 0X%X/n", &nGlobal); /*0X458FA0*/
printf("static variable : 0X%X/n", &nLocalStatic); /*0X458FA4*/
/*常量字符串*/
printf("local expression : 0X%X/n", pLocalString1); /*0X451348*/
printf("local const expression : 0X%X/n", pLocalString2); /*0X451338*/
/*局部变量:栈区*/
printf("local variable : 0X%X/n", &nLocal); /*0X12FED4*/
printf("Local array : 0X%X/n", &localArray); /*0X12FEC8*/
printf("local const variable : 0X%X/n", &nLocalConst); /*0X12FEB0*/
printf("local pointer : 0X%X/n", &pLocalString1); /*0X12FEA4*/
printf("local const pointer : 0X%X/n", &pLocalString2); /*0X12FE98*/
/*动态变量:堆区*/
printf("local new : 0X%X/n", pNew); /*0X3809F0*/
printf("Local malloc : 0X%X/n", pMalloc); /*0X380AB0*/
system("pause");
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/bxhj3014/archive/2008/10/04/3015797.aspx