动态链接库的全局变量和静态变量什么时候初始化?

时间:2022-10-11 19:42:29
普通程序的全局变量和静态变量是肯定在main之初始化,并在main之后销毁


动态链接库呢,好像没有什么文章进行描述?

是在动态链接库被打开时初始化,在关闭时销毁吗(执行析构函数)

还是没有规定,由编译器随意实现?

9 个解决方案

#1


很深奥的问题啊,lz有想法,我还没考虑过

#2


ZHEGE

#3


应该是加载时就初始化吧!

动态链接库跟可执行程序除了少了main函数执行入口,其他貌似都没区别吧!

#4


好像有点不一样

看了资料

共享库里面可以保留一些全局符号不定义

装载时直接使用主进程的定义
==============
这样的话这些全局变量就肯定不可能在动态库加载时重新构造了

#5


静态变量是在main执行之前初始化吗
我有点迷糊

#6


我想应该是在dllmain()调用之前吧。可以设计一个实验测试一下:
在dll里面定义一个类class A;在其构造和析构函数里面打印构造和析构消息。在dllmain函数里面的dll加载和卸载打印dll加载和卸载的消息。然后执行,看看顺序。

#7


我做过的实验  结果很奇怪  有时候会 有时候不会

#8


一旦D L L的文件映像被映射到调用进程的地址空间中, D L L的函数就可以供进程中运行的所有线程使用。实际上, D L L几乎将失去它作为D L L的全部特征。对于进程中的线程来说,D L L的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程调用D L L函数时,该D L L函数要查看线程的堆栈,以便检索它传递的参数,并将线程的堆栈用于它需要的任何局部变量。此外, D L L中函数的代码创建的任何对象均由调用线程所拥有,而D L L本身从来不拥有任何东西。

#9


在aix下实验,发现确实是打开时构造,关闭时析构

不过有点特别的,如果同时两次打开同一个共享库,则是第一次打开时构造,最后一次关闭时析构

#1


很深奥的问题啊,lz有想法,我还没考虑过

#2


ZHEGE

#3


应该是加载时就初始化吧!

动态链接库跟可执行程序除了少了main函数执行入口,其他貌似都没区别吧!

#4


好像有点不一样

看了资料

共享库里面可以保留一些全局符号不定义

装载时直接使用主进程的定义
==============
这样的话这些全局变量就肯定不可能在动态库加载时重新构造了

#5


静态变量是在main执行之前初始化吗
我有点迷糊

#6


我想应该是在dllmain()调用之前吧。可以设计一个实验测试一下:
在dll里面定义一个类class A;在其构造和析构函数里面打印构造和析构消息。在dllmain函数里面的dll加载和卸载打印dll加载和卸载的消息。然后执行,看看顺序。

#7


我做过的实验  结果很奇怪  有时候会 有时候不会

#8


一旦D L L的文件映像被映射到调用进程的地址空间中, D L L的函数就可以供进程中运行的所有线程使用。实际上, D L L几乎将失去它作为D L L的全部特征。对于进程中的线程来说,D L L的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程调用D L L函数时,该D L L函数要查看线程的堆栈,以便检索它传递的参数,并将线程的堆栈用于它需要的任何局部变量。此外, D L L中函数的代码创建的任何对象均由调用线程所拥有,而D L L本身从来不拥有任何东西。

#9


在aix下实验,发现确实是打开时构造,关闭时析构

不过有点特别的,如果同时两次打开同一个共享库,则是第一次打开时构造,最后一次关闭时析构