C++的存储空间和编译过程
存储空间
在C++中,内存存储通常分为以下五个区域:
1、代码区:
- 存储程序的执行代码,这部分区域是共享的,只读的,并且在程序执行期间并不会更改。例如当你编辑一个C++程序时,所有的函数定义,控制结构等都会被变成机器指令,然后存到代码区里面
2、全局、静态存储区
- 存储全局变量和静态变量的内存区域,这些变量在整个程序的执行期间都会存在,只不过他们的可见性与生命周期取决于声明它们的作用域
3、栈区
- 存储局部变量,函数参数,返回地址等的内存区域,它的特点是先进后出用于存储函数调用和自然变量
4、堆区
- 在C++中,我们程序员通过动态内存分配函数(new函数和malloc函数)分配的内存空间,在开辟之后必须手动释放,以免出现内存泄漏和野指针的问题(内存泄漏是指开辟内存没有手动回收,野指针是指使用已经被手动回收的指针)
5、常量区
- 常量区一般是存储字符串常量和const修饰的数据,它代表这部分数据仅仅是可读的,程序员并不能对它们进行修改
编译过程
C++程序的编译是一个相对复杂并且有序的过程,它涉及到将高级语言(C++)转换为机器可以识别的低级指令。在这个过程中,通常会生成.i(预处理文件)、.s(汇编文件)、.o(目标文件或对象文件)。以下是这个过程的详细解释
1、预处理
- 输入:C++源代码
- 处理:预处理器读取源代码文件,并对其进行宏展开、条件编译、文件包含等操作
- 输出:生成处理后的文件,通常带有.i后缀
2、编译
- 输入:预处理后的文件
- 处理:编辑器将预处理后的源代码或文件转为汇编语言代码。这个步骤是编译的核心,编译器需要执行词法分析、语法分析、语义分析、中间代码生成、代码优化等任务
- 输出:生成汇编文件,通常带有.s后缀
3、汇编
- 输入:汇编文件
- 处理:汇编器将汇编语言代码转化为机器代码(只有0和1组成的文件)但是这些指令仍然是针对特定架构的,尚未被来凝结的可执行文件
- 输出:生成目标文件,通常带有.o、.obj、.out等后缀
4、链接
- 输入:1个或多个目标文件以及可能需要的库文件
- 处理:在这个过程中,链接器将目标文件和库文件合并成一个可执行文件或库文件。在这个过程中,链接器会解决外部符号引用(即函数和变量的调用),并将它们链接到正确的地址
- 输出: 可执行文件.exe