🎯 一、什么是『编译时期』和『运行时期』?
名称什么时候发生谁负责编译时期 (Compile-time)写完代码后,执行前,编译器处理代码时编译器(如 g++、clang)运行时期 (Runtime)程序启动后,CPU 开始执行机器指令时操作系统 + CPU
简单来说:
编译时期:代码 → 机器指令的转换过程。
运行时期:机器指令真正被 CPU 执行、程序运行的阶段。
🎯 二、编译时期和运行时期各做了什么?
🧑💻 编译时期 (Compile-time)
阶段做了什么事预处理 (Preprocessing)宏替换 (#define)、头文件展开 (#include)语法分析 (Syntax analysis)检查语法是否正确(少分号、括号匹配)语义分析 (Semantic analysis)类型检查(int、double 类型匹配、变量声明)编译期计算 (Compile-time evaluation)常量计算、模板实例化、constexpr 常量求值优化 (Optimization)代码优化(常量折叠、循环展开、函数内联)代码生成 (Code Generation)转换成机器指令
举例:
constexpr int a = 10 * 3; // 编译时计算 → a = 30
int arr[a]; // 编译时已确定 arr 长度为 30
🚀 运行时期 (Runtime)
程序真正运行时(CPU 执行时)做的事:
阶段做了什么事程序启动 (Startup)载入程序到内存、分配堆栈执行代码 (Execution)实际执行你的代码指令(循环、函数调用)内存管理 (Memory Management)malloc / free、new / delete输入输出 (I/O)读写磁盘文件、控制台、网络异常处理 (Exceptions)运行时异常捕获
举例:
int x;
std::cin >> x; // 运行时,用户输入的值无法在编译时确定
🎯 三、如何快速区分编译时和运行时?(对照法)
特性编译时期运行时期发生时间编译代码时(程序未启动)程序运行时(程序启动后)处理对象源代码 (.cpp)机器指令(二进制可执行文件)负责执行编译器 (Compiler)操作系统 + CPU能否确定数值只能处理明确的值(如 constexpr、常量)运行时确定的值(如用户输入、随机数)错误类型编译错误(语法错误、类型错误)运行时错误(数组越界、空指针、除零)优化方式常量折叠、函数内联动态优化(JIT)
🎯 四、用简单代码区分『编译期』和『运行期』
📌 示例 1(编译期):
constexpr int a = 5;
constexpr int b = a * 2; // 编译期计算,确定 b = 10
int arr[b]; // 编译期确定数组大小 = 10
✅ 编译期就确定了 b 的值,不需要程序运行。
📌 示例 2(运行期):
int x;
std::cin >> x;
int y = x * 2; // 运行期才能确定 y 的值(取决于用户输入)
int* arr = new int[y];// 运行时才能确定数组大小
✅ 必须运行时用户输入后才确定 y 的值。
🎯 五、constexpr 和 const 对应编译期还是运行期?
关键词编译期还是运行期?说明constexpr✅ 编译期强制编译期就确定值const✅ 编译期或运行期都可能如果是简单的常量赋值,编译器会优化成编译期;但更复杂的情况可能是运行期
🎯 六、为什么需要区分『编译期』和『运行期』?
性能优化:
编译期计算提前完成,运行时减少负担。
错误检查:
语法、类型错误越早发现越好,编译期检查最严格。
功能实现:
有些功能(数组长度、模板参数)必须在编译期确定。
🎯 七、总结
最简单一句话区分:
编译时期就是『代码→指令』;
运行时期就是『CPU 执行指令』。