Linux系统下,程序是一个可执行文件,通常是ELF格式。通常,Linux的可执行文件拥有两种内存分配方式:存储时 和 运行时
1、存储时
看实例,下面是对可执行文件aa运行size命令后得到的结果。
[root@xxx1 algriom]# size aa
text data bss dec hex filename
1257 500 16 1773 6ed aa
其中:
text(代码区):表示正文段大小,是CPU执行的机器指令部分,通常,是可共享的,所以即使是频繁执行的程序在存储器中也只需有一个副本;
data(初始化数据区):表示包含静态变量和已经初始化(可执行文件包含了初始化的值)的全局变量的数据段大小;
bss :表示未初始化的全局变量和未初始化的静态变量,称之为未初始化数据段;
PS:第4列和第5列是分别以十进制和十六进制表示的三个段的总长度。
2、运行时(进程结构)
运行时是指一个正在运行的进程在内存空间中的结构,也就是一个进程的结构。
一般包括代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。
前三者与存储时相同,(1)栈区存储函数参数值、返回值、局部变量等。向下生长
(2)堆区用于动态内存分配。向上生长
堆区和栈区的区别如下:
(1)栈由操作系统自动管理,无需程序员手工控制,而堆区的申请和释放工作由程序员控制。
(2)栈是一块连续的内存区域,由系统预先设定,一般较小,从高地址向低地址增长;而堆是向高地址扩展的数据结构,是不连续的内存区域,空间较大。另外,分配的效率上,栈的分配比堆的分配要高效很多。
结论:
1、 经过初始化的全局变量和静态变量保存在数据段中。
2、 未经初始化的全局变量和静态变量保存在BSS段。
3、 函数内部声明的局部变量保存在堆栈段中。
4、 const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈段中。
5、 字符串常量保存在文本段中。