🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
当一个C/C++原码文件被编译链(比如gcc/g++)编译及链接成为可执行程序后,由4个段组成,分别是:代码段、数据段、栈、堆。 ### 代码段(.text)包含代码逻辑(函数),以及宏定义(#define)常量。 ### 数据段包含3部分:.bss,.rodata,.data。 * .bss: Block Started by Symbol,存放程序中未初始化的全局变量。 * .rodata:read only data,用于存放不可变修改的常量数据。 * .data:静态变量和已初始化的全局变量存储区。 ### 栈(.stack)主要用来存放局部变量, 传递的参数, 存放函数的返回地址;程序运行过程中动态生成及回收,不需要用户回收存储空间。 ### 堆(.heap)由malloc等API动态分配的内存区域,其生命周期由free决定;程序运行过程中动态生成,需要由使用者自行回收。 ### 了解程序的组成存储区有利于开发过程中对程序的精简,比如我们可以选择变量内容及大小是直接编译进可执行程序(ROM)中,还是程序运行过程中才被实例化(RAM);如果代码量10W+行基本能很明显的出现差异,同样功能有的代码编译出来占用空间非常大,有的很精简,其中一个原因就是对底层存储分区的理解不同。 ### 在我们Ubuntu Server目录:~/workspace/basics/c/3\_2\_variables,存放着本章节我们会用到的源代码文件;其中main\_1.c的内容是针对变量/函数的分区存储结构做了描述: ![](https://img.kancloud.cn/c5/f1/c5f1dc2a35ec81e4b53033190b05018b_832x888.png =600x) ### 我们尝试保留及注释掉.data里面的一个存储空间,对比两者编译后程序的大小。 ![](https://img.kancloud.cn/57/2e/572e65d34b6173e6c9dc3e385aa37cf6_832x66.png =600x) ### 差别巨大: ![](https://img.kancloud.cn/83/6a/836aa0a8bbe9fd88b891c92e5c313d8e_832x218.png =600x)