使用动态加载是否需要对代码进行严格合法的C++的特殊预防措施?
C++11标准引用某些事件的顺序,例如第一次调用main()之前发生的事情。然而,动态加载似乎是从程序中事件排序的典型假设中解脱出来的。
例如,引用了第3.6.2节。
静态初始化应在进行任何动态初始化之前执行。
在动态加载的情况下,这似乎是一个几乎不可能的义务,如果采取字面意思。程序可能会引发动态初始化,然后动态加载代码。如果该代码包含的变量通常是静态初始化的,则违反了C++标准。看来,“标准”规定的事件顺序似乎仍然可以被“如若不然”规则所满足和合法,但在其他地方,其他人则警告说,不要过于宽泛地解释该规则。
发布于 2014-09-21 20:57:35
C++标准没有任何关于动态模块的规定,因此需要进行一定的解释。
是的,在主模块中动态初始化变量之后,动态加载模块中的静态初始化变量将被初始化。您可以观察到这一点,并在对程序的行为产生影响的情况下构造程序。但是,如果您将DLL看作一个单独的程序,一个共享主程序内存空间但有自己的时间线的程序,您几乎可以在模块级别上应用相同的规则,并使用它们来预测应用程序范围内的行为。编译器不想让你吃惊..。只是有时候必须这样。
顺便说一句,当涉及到C++和DLL之间的冲突时,初始化顺序实际上是您最不关心的。动态模块破坏的规则要多得多,特别是在RTTI方面。
https://stackoverflow.com/questions/25957705
复制相似问题