dll中的共享内存
Shared memory in DLLs
如何在dll中共享内存?
当DLL附加到进程时,它使用与进程相同的内存地址。让我们假设在DLL中有以下函数:
int * data = 0;
int foo()
{
if (!data) data = new int(random());
return *data;
}
当进程A调用这个函数时,它创建一个新的对象(int)并返回它的值。但是现在进程B附加了这个DLL。它调用foo(),但我不明白它是如何工作的,因为data
是在进程' A内存空间。B怎么能直接使用它呢?
你是正确的,默认情况下dll不会跨进程共享内存。在您的示例中,进程A和B都将获得"data"的单独实例。
如果你想让一个DLL中的全局变量在使用该DLL的所有进程之间共享,你可以使用如下所述的共享数据段。您可以通过共享数据段共享预先声明的数组和值类型,但绝对不能共享指针。
您在这里误解了两个不同的概念- dll在这个意义上是共享内存,即(永远)不会更改的所有内容都是(物理地)共享的。它节省了你的内存,因为DLL中的很多数据是代码和其他常量数据,所以系统只使用它的一个副本,不管有多少进程使用它。这在系统级别上很重要——从应用程序的角度来看,根本没有可见的共享。
然而,像这里描述的内部数据不是在进程之间共享的——每个进程都有自己的副本。如果您对进程之间共享内存感兴趣,则需要其他机制。您可能对创建命名共享内存感兴趣。
进程B将有自己独立的内存空间,与进程a无关。data
变量将在进程B的进程空间内创建。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串