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