在不违反严格别名规则的情况下访问进程间共享内存中的对象

问题描述 投票:0回答:1

我有多个用C ++ 17编写的程序,在Linux上运行。

一个程序在/ dev / shm /下创建一个文件,并将其映射到它的内存空间。然后,它继续使用placement-new来初始化共享内存中的POD对象。

其他进程将打开并将这些文件映射到其内存空间以访问该对象。目前,我正在使用C风格的强制转换,但是我相信它是符合C ++别名规则的技术上未定义的行为,所以这可能会破坏GCC的未来版本。

编译器不知道该内存位置存在对象。通常情况下,我会通过调用placement-new将它传达给编译器,但在这种情况下会初始化现有对象(我认为这也是未定义的行为)。

如何在不违反严格别名规则的情况下访问此对象?这是std::launder的用例吗?

c++ ipc c++17 shared-memory interprocess
1个回答
1
投票

mmap函数返回一个void指针,而严格类型别名规则不适用于void指针,因为它们没有指向实际类型,但需要在访问之前将其转换为某些内容。所以在C ++中完全合法的是在void指针上使用类似C的强制类型转换或更好的static_casts。

但是,如果您访问共享内存中的数据,它可能会成为一个优化问题。如果他可以看到所有调用,则允许您的编译器假设RAM没有被更改。因此,您必须在其周围放置互斥锁,以确保您的编译器无法查看所有可能的访问权限并且必须重新加载数据。

© www.soinside.com 2019 - 2024. All rights reserved.