是否有任何 C 或 C++ 标准识别内存映射文件的存在?

Posted

技术标签:

【中文标题】是否有任何 C 或 C++ 标准识别内存映射文件的存在?【英文标题】:Does any C or C++ standard recognize the existence of memory mapped files? 【发布时间】:2016-03-31 19:30:49 【问题描述】:

我只是想知道是否可以在可移植的 C 或 C++ 中使用内存映射文件。我认为不是因为据我所知没有标准承认内存映射文件的存在。

使用内存映射可以在两个地址有相同的字节。另外,我认为如果不先在那里构造一个对象,甚至无法使用一块内存(通过char* 除外)。因此,如果我们想将现有的映射文件视为应该是未定义行为的整数数组。

那么内存映射文件和标准的情况如何?

【问题讨论】:

不,标准 AFAIK 中没有关于 内存映射文件 的概念。 在 C++14 标准中搜索 memory mapped 得到 0 个结果。 你可以将malloc()分配的内存作为你想要的任何类型的数组使用(前提是分配足够大),见C11标准草案n1570,6.5表达式6有效类型。你没有理由不能对mmap()分配的内存做同样的事情。 POSIX.1-2008 确实如此。因为它是管理许多操作系统接口(目录、文件等)和大多数当前操作系统(几乎所有操作系统,当然除了 Windows 的标准——尽管甚至微软刚刚宣布与 Canonical 合作提供某种支持—— - 因此,尽管它不是 C 标准,但它是在C 中管理此类OS 级接口的最可移植的标准(确切地说是IEEE Std 1003.1)。 【参考方案1】:

他们没有。内存映射通常由操作系统提供:C 和 C++ 也可以在没有它们的情况下运行。将这种可用性强加于语言目标的平台范围将非常有限。

在独立环境中也可能根本不支持文件,更不用说内存映射的了。

【讨论】:

【参考方案2】:

我只是想知道是否可以在可移植的 C 或 C++ 中使用内存映射文件。

是的(在 c++ 中),请参阅 boost.interprocess 库 http://www.boost.org/doc/libs/1_60_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file

我认为不是因为据我所知没有标准承认内存映射文件的存在。

不,它不在标准中,它在几乎可以移植的 boost 库中。

使用内存映射可以在两个地址有相同的字节。另外,我认为如果不先在那里构造一个对象(通过 char* 除外),甚至无法使用一块内存。因此,如果我们想将现有的映射文件视为应该是未定义行为的整数数组。

请参阅上面的文档。您会发现 c++ 对象直接映射到共享内存中,但通过映射内存区域开头的特殊“偏移”指针进行寻址。

那么内存映射文件和标准的情况如何?

没有情况。它们不是标准内存模型的一部分。

【讨论】:

以上是关于是否有任何 C 或 C++ 标准识别内存映射文件的存在?的主要内容,如果未能解决你的问题,请参考以下文章

C 和 C++ 编码标准

使用内存映射文件或普通 Stream.Write 时是不是有任何持久性保证

是否有简单的 C 或 C++ API 来修改 selinux 上下文?

C++:从内存映射文件中读取/获取数据

是否有任何忽略默认内联函数的 C++ 标准的编译器? [复制]

是否有任何标准的包含顺序以避免隐藏的依赖关系? [复制]