网上找了一堆资料学习一下,了解这些,
有助于规化程序结构,优化代码;
使用gcc编译出来的程序,用size可以查看程序结构和大小,
如
#size hello
Text data bss dec hex filename
778 200 4 982 3D6 hello
所以一个可执行的程序文件,结构分三部分:
.text 代码段,用来存放代码,一般是只读的区域;
.data 数据段,用来存放全局初始化变量,常量,以及全局或局部静态变量,只初始化一次;
.bss BSS段,用来存放全局未初化数据,用0初始化;
那有人问非全局变量放哪里了?
还有常说的堆和栈呢?
程序在执行时,会产生临时变量或是函数返回值,
还有函数中动态分配的地址空间,如malloc, new等…
根据这些需求,才需要堆和栈的出现,
所以堆(heap)和栈(Stack)这两个段是在程序运行时才有.
.stack 栈区,用来存放局部变量,函数的参数,返回值等,由编译器自动分配释放;
栈的概念来自数据结构,栈只能在一端操作,所以先入栈的后出,“先进后出”,这种结构保护之前的现场,
如一个函数被调用后,产生的临时变量都会存到栈区的顶部,当函数完成后,会自动从顶部将刚使用的数据销毁;
另外栈区的地址是从高地址向下增长的;
.heap 堆区,用来动态内存分配,如malloc, new申请的内存,由程序员分配释放;