程序的内存分配
时间:2010-06-28 来源:星巴
- 栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注重它与数据结构中的堆是两回事,分配方式倒是类似于链表。
- .bss区 — 存放未初始化的全局变量和未初始化的静态变量,程序结束由系统释放
- .data区 — 已初始化的全局变量或静态变量
- .rodata区 — 存放常量数据
- .text区 — 代码段, 与.rodata不同在于这个段是可以执行的
例子程序
int a[10] = {1}; //.data区 |
以上这些信息通过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的函数只能由本文件使用.