Pri*_*tap 7 c static-variables
我想知道实际情况是什么,编译器如何处理静态变量.与自动变量不同,静态变量的值即使在块结束后仍然存在,但编译器实际上如何处理这个?
与堆栈上的局部变量不同,静态变量保存在特殊数据段中.静态变量所属的段取决于它们是否初始化为0.0初始化的静态数据进入.BSS(由符号开始的块),非0初始化数据进入.DATA.
如果您想了解有关可执行文件中不同段的更多信息,这个维基百科条目是一个很好的起点.我还强烈推荐Randal E. Bryant和David R. O'Hallaron 在计算机系统中的第7章:程序员的观点.
我在这里描述了一个特定的场景.您需要考虑到,从一个体系结构到另一个体系结构,从一个操作系统到另一个体系结构,细节会有所不同,依此类推.但是,可执行文件的总体布局仍然如所描述的那样.确实令人兴奋!
编辑:
作者恳请我澄清:
将0初始化变量划分为.bss和非0初始化为.data是什么意思?
从计算机系统的 7.4节:程序员对.BSS部分的看法:
此部分在目标文件中不占用任何实际空间; 它只是一个占位符.对象文件格式区分初始化和未初始化的变量以实现空间效率:未初始化的变量不必占用目标文件中的任何实际磁盘空间.
并且,来自维基百科:
通常,只有.BSS部分的长度,但没有数据,存储在目标文件中.程序加载程序在加载程序时为bss部分分配和初始化内存.
总结一下:它是一种节省记忆的机制.
典型的C编译器生成汇编输出,创建内存的四个"部分".链接器/加载器通常将标记有相同部分的各种项目组合在一起,因为它将程序加载到存储器中.最常见的部分是:
"text":这是实际的程序代码.它被认为是只读的(某些机器上的链接器/加载器可能会将它放在ROM中).
"data":这只是RAM的分配区域,从可执行文件复制初始值.加载器将分配内存,然后复制其初始内容.
"bss":与数据相同,但初始化为零.
"stack":简单地由加载程序为其程序堆栈分配.
全局变量和静态变量放在"data"和"bss"中,因此具有程序生命周期.但是,静态变量不会将它们的名称放在符号表中,因此它们不能像globals一样在外部链接.变量的可见性和生命周期是完全独立的概念:C的语法混淆了两者.
"自动"变量通常在程序执行期间在堆栈上分配(但如果它们非常大,则可以在堆上分配它们).它们只存在于堆栈框架内.