c++ - C/C++ 指针是否保持绝对内存地址,或者相对于应用程序,或者相对于模块?

  显示原文与译文双语对照的内容
0 0

如果使用( 通过 dlopen 下的或者 LoadLibrary 下的) 函数来调用这个函数,那么从动态加载的库中传递一个指针,然后尝试调用这个函数,它会正确工作。

如果将一个动态加载的库从一个动态加载的库传递到另一个? 如果指针至少相对于应用程序而不是相对于模块/库,则应该工作。

另一个例子是在一个应用程序中声明一个函数,并将指针传递给另一个完全独立的应用程序( C 和 C++ ) 。 我想如果指针是绝对的,它就能正常工作。 也许它只是不起作用,因为系统不会因为安全而不喜欢这样的交叉呼叫。

时间: 原作者:

0 0

,understand必须了解指针和 C++的值与实际使用的地址无关。指针的指针值为,在计算机指针和语言抽象指针之间进行bijectively映射。

在现代系统进程中,看到一个虚拟地址空间,每个进程都有自己的地址空间。 库可以加载到任何地址,因此在进程之间传递指针是毫无意义的- 至少在分页内存架构上是。 然而在进程计算机级别之间,指针在加载的库之间传递,所有它们共享相同的地址空间。 在语言层面上,它们可能不是同一个( 虽然通常是),如果有多个语言。 但是使用相同编译器创建的编译单元将使用相同的指针语义。 针对本机机器的大多数语言实现都在指针语义上同意,因这里必须在指针格式之间进行转换。

原作者:
0 0

它是 。

它是一个虚拟地址与这个--无关,它是一个收费的绝对虚拟地址。 无论使用虚拟内存还是物理内存,它对程序的性能都没有任何差异。 除非将指针传递给 ( 我很怀疑你是),否则不要关心这个问题,否则,你只需手动编写低级内核代码或者映射/unmapping页面,就可以了。

原作者:
0 0

不同操作系统上的工作方式不同。 在旧的/嵌入式操作系统上,所有进程共享相同的空间- 一个进程可以很容易地把事情搞乱。

在大多数通用( 例如 。未嵌入) 现代操作系统上,每个进程都有一个单独的地址空间。 所有地址都与这里空间相对应。 如果事情是在相同的过程它们共享地址空间,那么它是如何被编译/链接的。

因此,两个不同的进程没有隐式的方式来访问彼此的空间。

原作者:
0 0

是由于 MMU 。 它是大多数处理器中的硬件单元,用于保护应用程序。 它的主要目的是保护内核/操作系统不受应用程序的影响。 每个应用程序或者过程都有自己的内存,不能访问它的他进程,但必须以某种方式进入内核/os 。

原作者:
...