0

0

c++编译期和运行期的区别 c++程序生命周期【核心】

尼克

尼克

发布时间:2026-01-08 16:48:03

|

107人浏览过

|

来源于php中文网

原创

编译期是代码转化为机器指令的预审阶段,由编译器执行宏展开、模板实例化等静态操作;运行期是程序加载执行阶段,涉及内存分配、动态绑定等实际运行行为。

c++编译期和运行期的区别 c++程序生命周期【核心】

编译期和运行期是 C++ 程序生命周期中两个本质不同的阶段,区分它们的关键在于:谁在执行、做什么事、能访问什么资源、出错时如何反馈。

编译期:代码变成机器指令的“预审”阶段

编译期指从源码(.cpp/.h)经预处理、词法/语法分析、语义检查、优化,最终生成目标文件(.o/.obj)的过程,由编译器(如 clang、g++)主导。此时程序尚未运行,没有、堆、全局变量的实际内存,也没有 CPU 指令执行流。

  • 做的事包括:宏展开、模板实例化、constexpr 计算、static_assert 断言、类型推导(auto/decltype)、内联函数展开、常量折叠
  • 能用的只有编译器已知的静态信息:字面量、类型定义、模板参数、constexpr 表达式结果
  • 典型错误如:类型不匹配、未定义标识符、static_assert 失败、模板参数无法推导——这些直接导致编译失败,不生成可执行文件
  • 例子:constexpr int x = 2 + 3; 中的 2 + 3 在编译期就算出结果 5;template struct Array { int data[N]; }; 中的 N 必须是编译期常量

运行期:程序真正“活起来”的执行阶段

运行期指可执行文件被操作系统加载进内存、CPU 开始逐条执行指令的过程。此时有真实的内存布局(栈帧、堆区、数据段)、运行时类型信息(RTTI)、异常处理机制、动态链接等。

  • 做的事包括:变量初始化(非 constexpr 的)、new/malloc 分配内存、函数调用(含虚函数动态绑定)、throw/catch 异常、读写文件、网络通信
  • 能访问的是运行时才确定的值:用户输入、随机数、系统时间、指针解引用结果、多态对象的实际类型
  • 典型错误如:空指针解引用、数组越界、除零、内存泄漏、std::bad_cast——这些不会阻止编译,但会导致程序崩溃或行为未定义
  • 例子:int x = rand(); 的值只能在运行期确定;Base* p = new Derived(); p->foo(); 中调用哪个 foo 由运行时对象实际类型决定

关键分水岭:什么能在编译期决定?

核心判断标准是「是否依赖运行时状态」。C++11 起引入 constexpr、C++14 放宽限制、C++17 加入 if constexpr、C++20 引入 consteval,都是为了把更多逻辑前移到编译期。

Live PPT
Live PPT

一款AI智能化生成演示内容的在线工具。只需输入一句话、粘贴一段内容、或者导入文件,AI生成高质量PPT。

下载

立即学习C++免费学习笔记(深入)”;

  • 编译期友好:字面量、枚举值、constexpr 函数/变量、模板非类型参数、std::array 大小、std::is_same_v 等类型特征
  • 运行期专属:dynamic_casttypeidnew 表达式、std::vector 容量、std::string 内容、任何涉及 I/O 或系统调用的操作
  • 模糊地带需注意:lambda 默认捕获([=])不能用于编译期上下文;constexpr 函数体内若含运行期分支(如普通 if),整个调用仍可能退化为运行期执行

程序生命周期主线:从源码到进程结束

C++ 程序完整生命周期包含四个紧密衔接的阶段,编译期和运行期分别覆盖其中一部分:

  • 预处理期(属编译前期):处理 #include、#define、#ifdef,生成纯文本翻译单元
  • 编译期(狭义):翻译单元 → 汇编代码 → 目标文件(.o),完成语法/语义检查与优化
  • 链接期(编译后、运行前):合并多个 .o 和库,解析符号引用,生成可执行文件(ELF/PE)
  • 运行期:OS 加载程序,初始化全局对象(构造函数)、进入 main()、执行用户逻辑、调用 exit() 或返回、析构全局对象、释放资源

其中,编译期和链接期统称「构建期(build time)」,运行期也叫「执行期(execution time)」。理解这个链条,才能准确判断某段逻辑该放在哪一阶段、用什么语言特性表达最安全高效。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

324

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

723

2023.08.22

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

276

2024.02.23

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

58

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.2万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号