C++ 访问共享内存C+中的数据+;POSIX

C++ 访问共享内存C+中的数据+;POSIX,c++,posix,shared-memory,C++,Posix,Shared Memory,我打开一段共享内存,并对其进行处理。我知道内存中存储了几个数据向量。我想访问这些数据向量并对它们执行一些操作。我怎样才能做到这一点?将共享内存视为一个对象是否合适,以便我们可以将这些向量定义为对象的字段,并将那些需要的操作定义为对象的成员函数 我以前从未处理过共享内存。更糟糕的是,我对C++和POSIX是新的。有人能提供一些指导吗?简单的例子将不胜感激 int my_shmid = shmget(key,size,shmflgs); ... void* address_of_my_shm1 =

我打开一段共享内存,并对其进行处理。我知道内存中存储了几个数据向量。我想访问这些数据向量并对它们执行一些操作。我怎样才能做到这一点?将共享内存视为一个对象是否合适,以便我们可以将这些向量定义为对象的字段,并将那些需要的操作定义为对象的成员函数

我以前从未处理过共享内存。更糟糕的是,我对C++和POSIX是新的。有人能提供一些指导吗?简单的例子将不胜感激

int my_shmid = shmget(key,size,shmflgs);
...
void* address_of_my_shm1 = shat(my_shmid,0,shmflags);

Object* optr = static_cast<Object*>(address_of_my_shm1);
您可能希望断言
地址\ of \ shm1==地址\ of \ shm2
。但请注意,我说的是“可能”-你实际上不必这么做。某些类型/结构/类可以在不同的地址上同样好地读取

如果对象将出现在不同的地址空间中,那么进程A中shhm之外的指针可能不会指向与进程B中相同的对象。通常,shm之外的指针是不好的。(虚拟函数是对象外部和shm.Bad外部的指针,除非您有其他理由信任它们。)

如果shm中的指针出现在同一地址,则它们是可用的

相对指针可以非常有用,但是,同样,只要它们只指向shm内部。相对指针可能是相对于对象的底部的,也就是说,它们可能是偏移量。或者它们可能与指针本身有关。您可以定义一些很好的类/模板来进行这些计算,并在后台进行转换

如果数据只是POD(普通的旧数据),那么通过shmem共享对象是最简单的。没什么特别的

由于您所在的进程不共享整个地址空间,因此可能无法保证虚拟函数等内容在使用shm共享内存段的所有进程中都出现在同一地址。所以最好避免使用虚拟函数。(如果您努力尝试和/或了解链接,您可能在某些情况下能够共享虚拟函数。但如果必须进行调试,这是我将禁用的第一件事。)

只有在知道实现的对象内存模型时,才应该这样做。如果高级优化(对于C++)被禁用,比如将结构拆分为不连续的热部件和冷部件。由于这种优化对于C++来说是不合法的,所以您可能是安全的。 显然,如果您在所有方面都强制转换到相同的对象类型/类,您的情况会更好。
您可以使用非虚拟函数。但是,请注意,可以很容易地拥有相同的类,但不同版本的类-例如大小不同,例如,添加一个新字段并更改所有其他字段的偏移量-因此您需要非常小心,以确保所有方面都使用相同的定义和声明。

通过
shmemget
CreateFileMapping
共享内存有利于进程之间的共享。你在考虑这种进程间的沟通吗?@minjang是的。可能是因为我不熟悉内存管理,所以我倾向于将共享内存视为一个对象,并希望像访问对象一样访问其数据并对其执行操作@MaximYegorushkin这是非常具体和有益的,值得一个答案!谢谢
void* address_of_my_shm2 = shat(my_shmid,address_of_my_shm1,shmflags);