关于gcc的变量内存问题,大家来看总结的对不对

NickWilde 发布于 2013/08/22 21:12
阅读 656
收藏 0
linux下程序在内存中会分为这么几个段
代码段
数据段
bss段



其中,执行代码在代码段中(32位系统下,这个大小是.text + .rodata;但是在64位下,这个大小是.text + .rodata + .eh_frame(似乎和异常处理有关32位下gcc使用-fexceptions会增加这个段));
下面来整理几个情况
1.字面常量在代码段中(字符串常量这些)

一下变量定义均使用int类型作为实验对象
2.函数内部定义的局部常量
如果局部常量没有初始化,则不会被编译到程序中,仅仅只是作为符号存在,在初始化的时候在bss段进行分配。
如果局部常量初始化了,则会被编译到代码段中和.text段在一起但是增加了7字节(定义的常量应该是int类型4字节的)

3.全局常量
如果全局常量没有初始化,则不会被编译到程序中,仅仅只是作为符号存在,在初始化的时候在BSS段进行分配
如果全局常量初始化了,则被编译到代码段中和.rodata在一起,然后是增加了4字节(和局部常量进行区别!!!)

4.局部静态变量
如果静态局部变量没有初始化,则会被编译到bss段中,占用4个字节(注意,这个是会进行预先的数据分配的!!)
如果静态局部变量初始化,则会被编译到data段中,占用4个字节

5.全局静态变量
如果静态全局变量没有初始化,则会被编译到bss段中,占用4字节
如果静态全局变量被初始化,则会被编译到data段中,占用4字节

6.全局变量
如果全局变量没有初始化,则不会被编译到程序中,仅仅作为符号存在,在初始化的时候在bss段进行分配。
如果全局变量没有初始化,则会被编译到data段中,占用4字节。
加载中
0
中山野鬼
中山野鬼
没仔细整理过,曾经因为项目跟过,不过那好像也不是标准的gcc。这些东西,真心没时间折腾,除非遇到特定项目,需要特定编译器时,才考虑。。哈。
0
I
IdleCloud

看了下,说得不怎么对。

NickWilde
NickWilde
哪里没对,指教下。
返回顶部
顶部