C++ 动态链接库(.dll)中的对象是否跨进程共享
假设我的.dll文件中有两个类和一个.c文件。比如C++ 动态链接库(.dll)中的对象是否跨进程共享,c++,dll,multiprocessing,dynamic-linking,C++,Dll,Multiprocessing,Dynamic Linking,假设我的.dll文件中有两个类和一个.c文件。比如 class MyClass { private : int id; Context* appContext; static Context* statContext; public: a(){ appContext = NULL; id = -1; } void setId(int a){ id = a; } void setContext(){ statContext = appContext =
class MyClass {
private :
int id;
Context* appContext;
static Context* statContext;
public:
a(){
appContext = NULL;
id = -1;
}
void setId(int a){
id = a;
}
void setContext(){
statContext = appContext = new Context();
}
Context* getContext(){
return appContext;
}
Contex* getStaticContex(){
return statContext;
}
int getId(){
return id;
}
}
class Context{
Contex(){};
~Context(){};
}
在我的.c文件中,有三个函数通过dllexport在.dll外部公开,其中包含
MyClass a;
void dllSetContext(){
a.SetContext();
}
Context* dllGetContext(){
a.getContext();
}
Context* dllGetStaticContext(){
a.getStaticContex();
}
- 现在,加载dll后的一个进程调用dllSetContext()李>
- 另一个进程也加载dll并调用dllGetContext()和 dllGetStaticContext()。它是否获得了appContext的实例, statContext由第一个进程设置
- 是否创建了两个独立的MyClass实例,每个实例都是独立的 每个进程的实例
- 或者这两个进程共享一个MyClass实例
我在这里的理解是,静态和全局变量不是跨多个进程共享的,而是其他变量跨多个进程共享。这取决于操作系统如何管理地址空间。在现代(32位)Windows操作系统中,每个进程都有一个地址。进程之间没有任何共同之处 在DLL中创建对象时,这没有什么不同。在不同的过程中会得到不同的实例。但他们可能会得到相同的虚拟地址。请记住,实例地址仅在加载DLL的进程中有效 当您为Windows3.x编程时,这可能会有所不同,但我怀疑您是否这样做 编辑是否以及如何在进程之间共享代码段取决于实际的O/S。在WinCE 5.0中,您有一个共享的进程槽。如果DLL在sysgen期间作为模块定位,则代码位于此共享插槽中,所有进程都可以在同一地址范围内看到。在桌面窗口中找不到此项
在某些O/S中,同一代码段可能位于同一物理地址中,但在依赖于进程的虚拟地址中可见。但是如果你开发一个应用程序,你不需要考虑它。代码在一个进程中是可见的。当DLL的加载地址已被占用时,相同的DLL代码可以位于不同的地址。在这种情况下,O/S会将DLL重新定位到空闲的addrrss范围。这需要(一点)时间,可以通过为每个DLL设置不同的默认加载地址来进行调整。这是否意味着对象创建代码是跨进程共享的,而不是对象共享的?对于32位及以上的WIN64、Unix系统(linux、mac)是否也一样?谢谢