代码是如何运行的?编译期和运行期的区分。

代码是如何运行的?编译期和运行期的区分。

🎯 一、什么是『编译时期』和『运行时期』?

名称什么时候发生谁负责编译时期 (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 执行指令』。

🌸 相关推荐 🌸

伊苏:塞尔塞塔的树海流程攻略
bt365体育在线官网

伊苏:塞尔塞塔的树海流程攻略

📅 07-13 👀 1472
王者荣耀孙策怎么玩(S31赛季孙策最强打法套路)
外勤365下载安装版本

王者荣耀孙策怎么玩(S31赛季孙策最强打法套路)

📅 07-11 👀 7170
肉放在冰箱里,冻多久就不能吃了?记得这个期限,超过就扔掉