我正在编写一些 C++ 代码,并且遇到了一个困扰我一段时间的问题...假设我在 Linux 主机上使用 GCC 为 ELF 目标进行编译,全局静态构造函数和析构函数在哪里叫?
我听说 crtbegin.o 中有一个函数 _init,crtend.o 中有一个函数 _fini。这些是由crt0.o调用的吗?或者动态链接器是否确实检测到它们在加载的二进制文件中的存在并调用它们?如果是这样,when它真的打电话给他们吗?
我主要想知道,这样我就可以了解当我的代码在运行时加载、执行和卸载时幕后发生的情况。
提前致谢!
更新:我基本上是想弄清楚调用构造函数的一般时间。我不想根据这些信息在我的代码中做出假设,或多或少是为了更好地了解程序加载时较低级别发生的情况。我知道这是非常特定于操作系统的,但我试图在这个问题中缩小范围。
当谈论非本地静态对象时,没有太多保证。正如您已经知道的(这里也提到过),它不应该编写依赖于它的代码。静态初始化顺序惨败...
静态对象经历两个阶段的初始化:静态初始化和动态初始化。前者首先发生,并通过常量表达式执行零初始化或初始化。后者发生在所有静态初始化完成之后。例如,这是调用构造函数的时候。
一般来说,这个初始化发生在 main() 之前的某个时间。然而,与许多人的想法相反,C++ 标准并不能保证这一点。实际上可以保证的是,初始化是在使用与正在初始化的对象相同的翻译单元中定义的任何函数或对象之前完成的。请注意,这不是特定于操作系统的。这是C++的规则。以下是该标准的引用:
It is implementation-defined whether or not the dynamic initialization (8.5, 9.4, 12.1, 12.6.1) of an object of
namespace scope is done before the first statement of main. If the initialization is deferred to some point
in time after the first statement of main, it shall occur before the first use of any function or object defined
in the same translation unit as the object to be initialized
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)