linux的可执行文件拥有两种内存分配方式:存储时 和运行时
1、存储时
存储时是指可执行文件尚未调入内存中运行。这时的存储分为3部分:代码区,数据区和未初始化数据区。
(1) 代码区:顾名思义,代码区即存储CPU可执行的机器代码的区域,值得指出的是指令的立即数是存储在这个区域,并且该区域一般是只读、共享的,因为对于频繁执行的代码只有一份代码并保证代码安全。
(2)数据区:包括全局的已经初始化了的数据、已经初始化了的静态变量(包括全局的静态变量和局部的静态变量)和常量数据(如字符串常量)。
(3)未初始化数据区(BSS,Block Started by Symbol):存入未初始化的全局变量和静态变量。一般由内核进行初始化赋值。
2、运行时
运行时是指在运行的过程中。一般包括代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。
前三者与存储时相同,栈区存储函数参数值、返回值、局部变量等,堆区用于动态内存分配。
堆区和栈区的区别如下:
(1)栈由操作系统自动管理,无需程序员手工控制,而堆区的申请和释放工作由程序员控制。
(2)栈是一块连续的内存区域,由系统预先设定,一般较小,从高地址向低地址增长;而堆是向高地址扩展的数据结构,是不连续的内存区域,空间较大。另外,分配的效率上,栈的分配比堆的分配要高效很多。