gpt4 book ai didi

c++ - 动态加载是否与 C++ 标准严格兼容?

转载 作者:太空狗 更新时间:2023-10-29 21:19:51 25 4
gpt4 key购买 nike

动态加载的使用是否需要任何特殊的预防措施以使代码严格合法 C++?

C++11 标准指的是某些事件的顺序,例如在第一次调用 main() 之前发生的事情。然而,动态加载似乎与有关程序中事件排序的典型假设不符。

例如引用 §3.6.2 中的一段话。

Static initialization shall be performed before any dynamic initialization takes place.

在动态加载的情况下,如果从字面上看,这似乎是一项几乎不可能的义务。程序可能会进行动态初始化,然后动态加载代码。如果该代码包含通常静态初始化的变量,则违反了 C++ 标准。标准规定的事件顺序似乎仍然可以满足并符合“好像”规则的合法性,但在 SO 的其他地方,其他人警告不要过于宽泛地解释该规则。

最佳答案

C++ 标准没有任何关于动态模块的规定,因此需要进行一定程度的解释。

是的,动态加载模块中的静态初始化变量将在主模块中的动态初始化变量之后被初始化。您可以观察这一点,并在它对程序行为产生影响的地方构建程序。但是,如果您将 DLL 视为一个单独的程序,它共享主程序的内存空间但有自己的时间线,那么您几乎可以在模块级别应用相同的规则,并使用它们来预测应用程序范围内的行为行为。编译器不想让您大吃一惊……它有时不得不这样做。

顺便说一句,当涉及到 C++ 和 DLL 之间的冲突时,初始化顺序实际上是您最不关心的问题。动态模块打破的规则远不止于此,尤其是涉及到 RTTI 时。

关于c++ - 动态加载是否与 C++ 标准严格兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com