【发布时间】:2020-08-09 22:16:36
【问题描述】:
我知道在 C 中,在main() 中启动应用程序之前,必须有一些实体:
- 初始化全局变量
- 将堆栈指针设置为最低堆栈区域地址(假设堆栈向上增长)
问题 1- 做这些事情的那个实体是什么?谁写的?
问题 2- C++ 中还有其他内容吗?
我假设对象构造函数和初始化都是在应用过程中完成的,main()
【问题讨论】:
-
当你运行一个程序时,动态链接器在
main之前做了很多事情。操作系统内核也做了很多。 -
执行“这个东西”的实体有时被称为“启动代码”。它进行设置,然后调用
main(),从main()捕获返回值,然后进行任何清理。它通常由提供编译器和标准库的供应商编写,但可能使用主机系统提供的代码。在 C++ 中,编译器负责发出代码,确保文件范围内的静态对象的构造函数在main()之前调用 - 可能还有其他静态变量 - 并且(理想情况下)它们的析构函数在main()之后调用(以相反的顺序建设)。 -
@harper:这是对 C 的一个 hack,在 C++ 中,该语言具有本机功能(具有构造函数的全局对象)
-
很多全局变量实际上不需要实例化代码,因为它们实际上存储在可执行文件的数据部分中。至于堆栈指针,在 bss 部分中通常为 8 KiB 的内核中(静态分配,但未设置)。在普通应用程序中,它可能是在运行时分配的。如果要查看启动代码反汇编可执行文件并查找导出的函数,通常命名为
start。那是真正的入口点,它最终调用main。它还在 Windows 中调用crtStartup或其他名称。
标签: c++