区分 C++ 编译期与运行期:一篇就够了

1. 编译期 (Compile Time)

定义: 编译期是指从你编写的 C++ 源代码 (.cpp, .h 文件) 开始,到编译器将其转换为可执行的机器代码(例如 Windows下的.exe 文件或 Linux/macOS 下的可执行二进制文件)为止的整个过程。

执行者: C++ 编译器 (例如 g++, clang, MSVC)。

输入: C++ 源代码文件。

主要活动:

预处理 : 处理以 # 开头的指令,例如 #include (包含头文件内容)、#define (宏定义替换)、#ifdef/#endif (条件编译)。

词法分析 : 将源代码分解成一个个独立的词法单元 (tokens),如关键字 (int, class)、标识符 (myVariable)、操作符 (+, =)、字面量 (123, “hello”) 等。

语法分析 : 根据 C++ 语法规则,将词法单元组成抽象语法树 (AST),检查代码结构是否符合语法规范(例如,括号是否匹配,分号是否缺失)。

语义分析 : 检查代码的逻辑意义是否正确,进行类型检查(例如,int 不能直接赋值给 string),检查变量/函数是否已声明,检查访问权限(public/private/protected)等。

优化 : 编译器尝试改进代码,使其运行得更快或占用更少的内存,同时保持其原始逻辑不变(例如,常量折叠、循环展开、函数内联)。

代码生成: 将经过分析和优化的中间表示(通常是抽象语法树或类似结构)转换为特定目标平台(CPU 架构和操作系统)的机器代码或汇编代码。

链接 : (严格来说,链接可以看作编译过程的最后一步或一个独立阶段) 将多个编译单元生成的对象文件 (.o 或 .obj) 以及所需的库文件链接在一起,解析外部引用,最终生成一个单一的可执行文件。

输出: 可执行文件、对象文件、库文件。

在此阶段确定的事情:

变量和函数的类型。

类的大小和内存布局(非虚)。

const 和 constexpr 变量的值。

模板的实例化。

宏展开的结果。

函数重载的决策。

错误类型: 编译期错误 (Compile-time errors)。例如:

语法错误 : 缺少分号、括号不匹配。

类型错误 : 将不兼容的类型赋值、函数参数类型不匹配。

未声明的标识符 : 使用了未声明的变量或函数。

链接错误 : 找不到函数定义、重复定义。

编译期错误会阻止程序成功生成可执行文件。

2. 运行期 (Runtime)

定义: 运行期是指可执行文件被加载到内存中并由操作系统开始执行,直到程序结束为止的阶段。

执行者: 计算机的 CPU,在操作系统的管理下。

输入: 由编译器生成的可执行机器代码,以及程序运行时需要的外部数据(如用户输入、文件内容、网络数据)。

主要活动:

程序加载: 操作系统将可执行文件从磁盘加载到内存中。

内存分配: 为程序变量分配内存空间(栈空间用于局部变量和函数调用,堆空间用于动态分配的内存,如 new)。

指令执行: CPU 按照程序的逻辑顺序执行机器指令。

与外部交互: 读取用户输入、读写文件、进行网络通信、与硬件设备交互。

动态行为:

程序终止: 程序执行完毕或遇到无法处理的错误而结束。

输出: 程序的运行结果、对文件的修改、屏幕上的输出、网络发送的数据等。

在此阶段确定的事情:

非 const/constexpr 变量的具体值(可能来自输入或计算)。

动态分配内存的地址和大小。

函数调用的实际执行路径(基于 if/else, switch, 循环条件)。

虚函数调用的具体目标函数。

程序实际运行的时间、消耗的内存。

错误类型: 运行期错误 (Runtime errors)。例如:

逻辑错误 : 程序运行结果不符合预期,但没有崩溃。

除零错误 。

空指针解引用。

数组越界访问。

内存泄漏: 分配的堆内存未释放。

栈溢出 通常由过深的递归或过大的栈上局部变量导致。

未处理的异常 。

文件未找到 。

运行期错误通常会导致程序崩溃 或产生不正确的结果。

总结区别:

特性编译期 (Compile Time)运行期 (Runtime)
时间程序执行之前 (源代码 -> 可执行文件)程序启动后 (加载 -> 执行 -> 结束)
执行者编译器 / 链接器CPU / 操作系统
处理对象源代码 (.cpp, .h), 库文件机器代码 (可执行文件), 运行时数据
主要任务语法/语义检查, 类型检查, 优化, 生成机器代码加载, 动态初始化, 执行指令, 内存管理, I/O, 动态行为
错误类型编译/链接错误 (阻止程序生成)运行错误 (程序崩溃或行为异常)
关注点代码的静态结构, 类型, 语法正确性代码的动态执行, 逻辑, 资源交互, 实际行为
确定性决定类型, 常量值, 模板实例化等静态信息决定变量值, 内存地址, 执行路径, 动态绑定等动态信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值