我有多个用 C++17 编写的程序,在 Linux 上运行。
一个程序在/dev/shm/下创建一个文件并将其映射到它的内存空间。然后它继续使用 placement-new 来初始化共享内存中的 POD 对象。
其他进程将打开并将这些文件映射到它们的内存空间以访问该对象。目前,我使用的是 C 风格的强制转换,它可以工作,但我相信根据 C++ 别名规则,这在技术上是未定义的行为,因此这可能会在 GCC 的 future 版本中中断。
编译器不知道该内存位置存在一个对象。通常,我会通过调用 placement-new 将其传达给编译器,但在这种情况下会初始化现有对象(我认为这也是未定义的行为)。
我应该如何在不违反严格的别名规则的情况下访问这个对象? 这是 std::launder 的用例吗? ?
最佳答案
mmap 函数返回一个 void 指针,严格的类型别名规则不适用于 void 指针,因为它们不指向实际类型,但需要在访问之前转换为某些内容。因此,在 C++ 中,对 void 指针使用类似 C 的强制转换或更好的 static_cast 是完全合法的。
但是如果您访问共享内存中的数据,它可能会成为一个优化问题。如果编译器可以看到所有调用,则允许您的编译器假定 RAM 没有被某些东西改变。因此,您必须在它周围放置例如互斥锁,以确保您的编译器无法看到所有可能的访问并且必须重新加载数据。
关于c++ - 在不违反严格的别名规则的情况下访问进程间共享内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876649/