ARM汇编中全局变量存储位置疑问:全局数据段还是动态数据段?
全局变量的存储位置解析
先直接给结论:全局变量的存储位置得看它的定义和初始化方式,和“程序启动时是否知道值”没有直接绑定关系,动态数据段(堆)也不是用来存这类全局变量的。
普通全局变量(编译/链接阶段可确定值或未初始化)
这类变量会被放在全局数据段里,具体又分两种:- 已经初始化且值固定的,比如
int global_num = 20;,会存在.data子段; - 未初始化(或初始化为0)的全局变量,比如
int uninit_global;,会存在.bss子段。
这两个子段都属于你书里说的“全局数据段”范畴,内存是程序加载时就分配好的,生命周期和整个程序一致。
- 已经初始化且值固定的,比如
运行时才确定初始化值的全局变量
比如你写int runtime_global = get_some_value_at_start();,这种变量的存储位置依然在全局数据段(.data)里。区别只是它的初始化逻辑会被放到程序启动的初始化流程中,等程序运行起来后再把计算好的值赋值给它,本质上还是全局数据段的变量,和动态数据段没关系。动态数据段(堆)存的是什么?
动态数据段是用来存运行时手动申请的内存,比如用malloc()、new这类函数分配的内存,或者动态加载的模块数据。这些内存不是全局变量,它们的生命周期由开发者手动控制(申请、释放),和全局变量的“程序启动即存在、退出才释放”完全不同。
你书里的内存布局图应该也能佐证这一点:全局数据段是程序加载时就固定好的内存区域,而动态数据段是程序运行后可以灵活扩展的区域,两者的定位和使用场景完全不一样。
内容的提问来源于stack exchange,提问作者user394334
相关产品推荐
相关产品推荐

