C++内存区域

来源:互联网 发布:bootstrap less源码 编辑:程序博客网 时间:2024/05/17 07:32
 

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");

}

原创粉丝点击