编译期是代码转化为机器指令的预审阶段,由编译器执行宏展开、模板实例化等静态操作;运行期是程序加载执行阶段,涉及内存分配、动态绑定等实际运行行为。
编译期和运行期是 C++ 程序生命周期中两个本质不同的阶段,区分它们的关键在于:谁在执行、做什么事、能访问什么资源、出错时如何反馈。
编译期指从源码(.cpp/.h)经预处理、词法/语法分析、语义检查、优化,最终生成目标文件(.o/.obj)的过程,由编译器(如 clang、g++)主导。此时程序尚未运行,没有栈、堆、全局变量的实际内存,也没有 CPU 指令执行流。
constexpr int x = 2 + 3; 中的 2 + 3 在编译期就算出结果 5;template struct Array { int data[N]; }; 中的 N 必须是编译期常量运行期指可执行文件被操作系统加载进内存、CPU 开始逐条执行指令的过程。此时有真实的内存布局(栈帧、堆区、数据段)、运行时类型信息(RTTI)、异常处理机制、动态链接等。
int x = rand(); 的值只能在运行期确定;Base* p = new Derived(); p->foo(); 中调用哪个 foo 由运行时对象实际类型决定核心判断标准是「是否依赖运行时状态」。C++11 起引入 constexpr、C++14 放宽限制、C++17 加入 if constexpr、C++20 引入 consteval,都是为了把更多逻辑前移到编译期。
constexpr 函数/变量、模板非类型参数、std::array 大小、std::is_same_v 等类型特征dynamic_cast、ty
peid、new 表达式、std::vector 容量、std::string 内容、任何涉及 I/O 或系统调用的操作[=])不能用于编译期上下文;constexpr 函数体内若含运行期分支(如普通 if),整个调用仍可能退化为运行期执行C++ 程序完整生命周期包含四个紧密衔接的阶段,编译期和运行期分别覆盖其中一部分:
其中,编译期和链接期统称「构建期(build time)」,运行期也叫「执行期(execution time)」。理解这个链条,才能准确判断某段逻辑该放在哪一阶段、用什么语言特性表达最安全高效。