dll中的共享内存

Shared memory in DLLs

本文关键字:内存 共享 dll      更新时间:2023-10-16

如何在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的进程空间内创建。