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