文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>程序的内存分配

程序的内存分配

时间:2010-06-28  来源:星巴

1.程序的内存分配 程序内存分为以下几个部分:
  • 栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注重它与数据结构中的堆是两回事,分配方式倒是类似于链表。
  • .bss区 — 存放未初始化的全局变量和未初始化的静态变量,程序结束由系统释放
  • .data区 — 已初始化的全局变量或静态变量
  • .rodata区 — 存放常量数据
  • .text区 — 代码段, 与.rodata不同在于这个段是可以执行的

例子程序

int a[10] = {1}; //.data区
int b[10]; //.bss区

main()
{
   int c[10] = {1}; //.data区
   static d[10]; //.bss区
   static e[10] = {1}; //.data区
   int f; //stack
   char *p; //stack
   char *p1 = "123456"; //p1在stack区, "123456\0"在.rodata区
   char *p2; //stack

   p2 = (char *)malloc(10);//分配出来的字节在堆区
}


以上这些信息通过objdump -x main | grep xxx可以看出,需要注意的是,.data与.rodata占用程序空间,这点通过readelf -a ./main 中的.data或.rodata的大小可以看出,因此实际使用时要多加注意.

2.static全局变量与普通全局变量的不同?static局部变量与普通局部变量的不同?static函数与普通函数的不同

前两个问题要从以下两点进行分析:

  • 作用域

static全局变量与普通全局变量的存储位置没有什么不同,他们的区别在于作用域的不同,static全局变量的作用域是该文件范围,而普通的全局变量可由其它文件引用.

  • 生存期

static局部变量与普通的局部变量的作用域是一样的,都只能供本函数使用,但是他们的存储区却是不同,未初始化的static局部变量保存于.bss区,而初始化过的static局部变量保存在.data区,而普通的局部变量保存在堆栈啊,函数调用完毕即释放空间,static局部变量的值不会释放.

至于static函数,也是个作用域的问题,申明了static的函数只能由本文件使用.

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载