【发布时间】:2021-10-18 15:18:31
【问题描述】:
受Dealing with large data binary files启发的问题
链接到Object
程序 (1) 创建一个内存映射文件并向其中写入一些对象(C++ 标准定义),关闭文件并退出。
程序(2)将上述文件映射到内存中,并尝试通过reinterpret_cast访问对象。
这在标准中是否合法,因为对象表示没有改变并且对象仍然存在于文件中?
如果这是在 2 个进程之间尝试的,不是使用文件,而是使用共享进程内存是否合法?
注意 - 这个问题不是关于存储或共享本地虚拟地址,因为这显然是一件坏事。
【问题讨论】:
-
对象生命周期的范围在正在执行的 C++ 程序中。程序 (1) 看到的对象不是程序 (2) 看到的对象。但是该对象在程序 (2) 中根本不存在,因为它的生命周期从未开始。
-
如果
Object不是太大并且是标准布局对象,您可以将memcpy表示从内存映射文件到对象的实际实例。 -
@FrançoisAndrieux 这将您可以使用的类型限制为可轻松复制的类型en.cppreference.com/w/cpp/types/is_trivially_copyable
-
@PepijnKramer 我不确定简单可复制是否足够,因为数据来自可能使用不同实现编译的另一个进程。标准布局类型在编程语言之间是兼容的,所以应该没问题。简单可复制的类型在不同实现中可能没有相同的布局。
-
是的,序列化就像那样很难(尽管我假设两个进程都使用相同的设置进行编译)。 @Richard Critten 查看了 IPC(进程间通信)协议,它们以标准化格式将类型从一个进程发送到另一个进程。 (例如 protobuf)
标签: c++ language-lawyer