linux下global,static,const,local变量存放区域

89 篇文章 0 订阅
26 篇文章 0 订阅
linux下,可执行文件格式是ELF格式,程序中数据在逻辑上大致可以分成下面几个大的区域:

Ÿ  Text: 执行的指令序列流,是只读内存区(编译期就决定了其内容);.

Ÿ  Data: 程序所使用的静态变量和全局变量区(编译期就决定了其内容);

Ÿ  Heap堆,进程动态申请的内存区,使用new,malloc操作申请的内存;

Ÿ  Stack:栈,动态增长和收缩的内存区,函数参数,返回值,调用栈,局部变量存放区域;


其中Data区域其实可以进一步细分为更多section,下面我们具体看看
  1. static int val_a = 1; // 初始化的静态变量
  2. int val_b = 2;        // 全局变量
  3. const int val_c = 3;  // const 全局变量
  4. static int val_d;     // 未初始化的静态变量
  5. int val_e;            // 未初始化的全局变量
  6. int main(int argc, char *argv[])
  7. {
  8.     static int val_f = 5;  // 初始化的局部静态变量
  9.     static int val_g;      //未初始化局部静态变量
  10.     int    val_h = 6;      //初始化局部变量
  11.     int    val_i;          //未初始化局部变量
  12.     const  int val_j = 7;  //const局部变量
  13.     return 0;
  14. }

  15. g++ main.cpp -o test

通过objdump命令查看各种变量分布位置
objdump -t -T  test | grep 'val'
000000000060095c l     O .data  0000000000000004              _ZL5val_a
000000000060097c l     O .bss   0000000000000004              _ZL5val_d
0000000000400678 l     O .rodata        0000000000000004      _ZL5val_c
0000000000600980 l     O .bss   0000000000000004              _ZZ4mainE5val_g
0000000000600964 l     O .data  0000000000000004              _ZZ4mainE5val_f
0000000000600960 g     O .data  0000000000000004              val_b
0000000000600978 g     O .bss   0000000000000004              val_e

做一下总结
data 区存放 初始化的全局变量和静态变量
bss  区存放 未初始化的全局变量和静态变量
rodata 区存放 只读的数据,const变量

其中 val_h, val_i,是局部变量,在进程启动main函数执行后,在栈里面分配;
val_j 虽然是const 变量,也是在栈里面分配

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值