C++程序启动时,操作系统先加载可执行文件并分配资源,随后运行时启动代码初始化C/C++环境,构造全局静态对象,初始化运行库并准备atexit机制,之后才调用main函数;main执行期间异常处理、RTTI等功能依赖前期初始化;main结束后按序析构局部与全局对象,执行atexit注册函数,关闭标准流,最终通过exit将控制权交还操作系统,整个过程由编译器生成代码与运行时系统协作完成。

一个C++程序的启动过程远不止从 main 函数开始那么简单。在 main 函数执行前,运行时环境需要完成一系列准备工作;而在 main 执行结束后,还需要进行清理和资源回收。整个流程由操作系统、编译器生成的启动代码以及 C++ 运行时系统共同协作完成。
main 函数之前:程序的初始化阶段
在进入用户编写的 main 函数之前,程序已经经历多个关键步骤:
- 操作系统加载可执行文件:操作系统将程序的可执行映像(包括代码段、数据段等)加载到内存,并为进程分配资源,建立虚拟地址空间。
- 运行时启动代码(CRT Startup)执行:编译器会链接一段称为 C Runtime (CRT) 的启动代码,通常以 start 或类似符号为入口。这段代码负责初始化 C/C++ 运行时环境。
- 全局/静态对象构造:C++ 标准规定所有全局变量和静态变量在 main 之前完成构造。这一过程由编译器生成的 .init_array 段(或 .ctors)中的函数指针数组控制,逐个调用构造函数。
- C 运行库初始化:包括堆内存管理器(malloc/free)、I/O 缓冲区(如 stdin/stdout)、多线程支持等子系统的初始化。
- atexit 注册机制准备就绪:用于后续注册 main 结束后需调用的清理函数。
main 函数的执行
当上述初始化全部完成后,控制权才真正交给用户的 main 函数:
- main 函数被调用,参数 argc 和 argv 由操作系统传递给程序,表示命令行参数数量和内容。
- 程序主体逻辑在此运行,可能涉及动态内存分配、文件操作、线程创建、异常抛出等行为。
- C++ 异常处理机制(如 try/catch)、RTTI(运行时类型信息)在此阶段可用,依赖前期初始化完成。
main 函数之后:程序的终止与清理
main 函数返回后,程序并未立即结束,仍有一系列收尾工作要执行:
标签: c++ 程序启动 linux 操作系统 栈 ai win 状态码 作用域
还木有评论哦,快来抢沙发吧~