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

原创 2016年08月31日 12:08:38
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 变量,也是在栈里面分配

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(470) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
评论热议
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

静态变量、全局变量在ELF文件中的位置

静态变量编译之后,被编译器放到了可执行文件的哪个字段? 以下实验在ubuntu10.04上完成,使用gcc4.4.3。 测试源码如下: #include int g_v...

const、static变量存放位置

我们将以下面的例子介绍const变量和static变量的存放位置:static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量...

Static Variable, Auto Variable, Global Variable, Local Variable, Register Variable (C)

变量的作用域: (1)局部变量: 即在函数内部定义的变量,形式参数也属于局部变量。局部变量只在定义它的函数内部有效。 (2)全局变量: 即所有函数外部定义的变量,其作用范围是从定义变量的位置开始到...

php函数,static,global关键字及三种变量作用域

函数和js函数类似,关注php与其他语言不用的地方 函数的形参默认值形式:function f($a,$b=3,$vc = "abc"){} 注意:没有给默认值的形参必须传递值, 形参的传值问题一句话...
  • ydxlt
  • ydxlt
  • 2016年01月25日 16:48
  • 2739

non-local static 变量初始化顺序不确定,带来的问题

    所谓static对象,其寿命从被构造出来直到程序结束为止,因此stack和heap-based对象都被排除。这种对象包括global对象、定义于namespace作用域内的对象,classes...

C++带const、static和#define关键字的变量定义的区别

一、const  1.变量定义中    (1)const int a=10;    说明:定义的int型变量a不能被修改,只能被使用。带const关键字的变量可以定义为全局变量,但此时定义的全局...

const,static,全局变量细节及其区别

const: 限制符号,限制某个变量所指向的内容不能通过这个对象修改。 但是可以通过其他的修改,比如: int main(){ int x=5; const int &y=x; x+...

C++中成员变量加上static或const关键字后的分析

C++中类成员变量加上static或const关键字后的初始化问题。在一个简单的C++类中定义如下这些变量: #include using namespace std; class TestVa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下global,static,const,local变量存放区域
举报原因:
原因补充:

(最多只允许输入30个字)