代码区:加载的是可执行文件的代码段,其加载到内存中的位置由加载器完成。在有操作系统支持时,程序不需要关注这一位置;如果是自己移植操作系统,则需要事先规划各加载位置。这一点请参阅相关OS移植内容。
全局初始化数据区/静态数据区:加载的是可执行文件数据段,位置可位于代码段后也可以分开。程序 在运行之初就为该数据段申请了空间,在程序退出时才释放,因此,存储于数据段的数据的生命周期为整个程序运行过程。
为初始化数据区(BSS)。加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段。程序在运行之初就为该部分申请了空间,在程序退出时才释放,因此,存储玉该部分的数据的生命周期为整个程序运行过程。
栈区:由编译器自动分配释放,存放函数的参数值,返回值,局部变量等。在程序的运行过程中实时申请和释放,因此,局部变量的生存周期为申请到释放该段空间。
堆区:用于动态内存分配。一般由程序员分配和释放,若程序员不释放,程序结束时由OS回收。
系统之所以分成这么多个区域,主要基于一下考虑.
1.代码段和数据段分开,运行时便于分开加载,在哈佛体系结构的处理器将取得更好的流水线处理效率。
2.代码是依次执行的,由处理器的PC指针依次读入,而且代码可以被多个程序共享,数据在整个运行过程中有可能多次被调用,如果将代码和数据混合在一起将造成空间的浪费。
3.临时数据及需要再次使用的代码在运行时放入栈中,生命周期短,便于提高资源利用率。
4.堆区可以由程序员分配和释放,以便用户自由分配,提高程序的灵活性。
全局初始化数据区/静态数据区:加载的是可执行文件数据段,位置可位于代码段后也可以分开。程序 在运行之初就为该数据段申请了空间,在程序退出时才释放,因此,存储于数据段的数据的生命周期为整个程序运行过程。
为初始化数据区(BSS)。加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段。程序在运行之初就为该部分申请了空间,在程序退出时才释放,因此,存储玉该部分的数据的生命周期为整个程序运行过程。
栈区:由编译器自动分配释放,存放函数的参数值,返回值,局部变量等。在程序的运行过程中实时申请和释放,因此,局部变量的生存周期为申请到释放该段空间。
堆区:用于动态内存分配。一般由程序员分配和释放,若程序员不释放,程序结束时由OS回收。
系统之所以分成这么多个区域,主要基于一下考虑.
1.代码段和数据段分开,运行时便于分开加载,在哈佛体系结构的处理器将取得更好的流水线处理效率。
2.代码是依次执行的,由处理器的PC指针依次读入,而且代码可以被多个程序共享,数据在整个运行过程中有可能多次被调用,如果将代码和数据混合在一起将造成空间的浪费。
3.临时数据及需要再次使用的代码在运行时放入栈中,生命周期短,便于提高资源利用率。
4.堆区可以由程序员分配和释放,以便用户自由分配,提高程序的灵活性。