c++ - C++ 中 main 之前发生了什么?

标签 c++

我知道在 C 中,在应用程序可以在 main() 中启动之前,一些实体必须:

  1. 初始化全局变量
  2. 设置栈指针指向栈区最低地址(假设栈向上增长)

问题 1 - 执行此操作的实体是什么?谁写的?

问题 2 - C++ 中是否还有其他内容? 我假设对象构造函数和初始化都是在应用程序期间完成的,在 main()

之后

最佳答案

很大程度上取决于执行环境。在 C 运行时启动之前,操作系统加载程序可能会完成大量工作,这特别是您的可执行文件运行的一部分。与操作系统相关的设置执行环境的部分对于所有 native (机器语言)可执行文件都是通用的,无论源实现语言如何。

操作系统扮演什么角色以及作为可执行文件一部分的代码执行什么取决于执行环境。操作系统加载器(在非独立系统中)负责将代码加载到内存中,并且可能涉及加载和链接动态链接库(DLL 或共享库,具体取决于操作系统命名法)。无论是操作系统还是 C 运行时责任,通常会发生以下情况:

  • 堆栈的建立
  • 初始化静态数据的零初始化
  • 显式初始化静态数据的初始化
  • C 库初始化(通常 stdio 和堆管理需要一些初始化)
  • 对于 C++ 调用静态构造函数。
  • main() 创建栈帧(argvargc 参数)

例如,在 GCC 和其他一些编译器中,在程序启动之前由您的程序而不是操作系统执行的部分由名为 crt0.o 的单独链接模块执行。 .这通常是用汇编程序编写的,默认情况下会自动链接。

有关更多示例和讨论,请参阅:

关于c++ - C++ 中 main 之前发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53570678/

相关文章:

c++ - opencv标量中的错误值

c++ - 为什么 shared_ptr 使用placement new

c++ - 如何通知系统创建新设备?

c++ - OpenSSL/c/c++ - EC secp256k1 key 生成

c# - 关于ftps服务器的问题

c++ - wxTextValidator 的 ctor 中的 valPtr 有什么用?

c++ - 将 OpenBLAS 与 GSL 结合使用

c++ - '类' : illegal use of this type as an expression how do I fix it?

c++ - asio 异步服务器不接受连接

c# - 确定 Windows 应用商店应用程序是否已从 Windows 服务中暂停或逻辑删除