任何C或C++标准是否认可内存映射文件的存在?

4
我想知道在可移植的C或C ++中是否有可能使用内存映射文件。据我所知,没有任何标准认识到内存映射文件的存在,因此我认为不可能。
使用内存映射可以使相同的字节出现在两个地址上。此外,我认为甚至不能在没有先构造对象的情况下使用一段内存(除非通过“char *”)。因此,如果我们想将一个现有的映射文件作为整数数组处理,则会产生未定义的行为。
那么,标准对于内存映射文件的情况如何呢?

2
据我所知,标准中没有关于“内存映射文件”的概念。 - πάντα ῥεῖ
在C++14标准中搜索memory mapped没有任何结果。 - NathanOliver
你可以将malloc()分配的内存用作任何类型的数组(前提是分配足够大),请参阅C11草案标准n1570,6.5表达式6有效类型。使用mmap()分配的内存同样适用。 - EOF
3
POSIX.1-2008 是一个标准,它规定了许多操作系统接口(目录、文件等),并且大多数当前的操作系统都遵循该标准(除了Windows)。虽然 POSIX 不是 C 标准,但它是最具可移植性的标准(确切地说是 IEEE Std 1003.1),用来规范 C 语言中的操作系统级别接口。值得一提的是,即使是微软也宣布与 Canonical 合作支持 POSIX,所以它在操作系统层面上具有广泛的应用。 - Nominal Animal
2个回答

6
他们并不需要。内存映射通常由操作系统提供:C和C++也可以在没有内存映射的情况下运行。强制在语言目标范围内实现这种可用性将非常有限。
在自由环境中,文件可能根本不被支持,更不用说内存映射了。

6
我想知道在便携式的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++对象直接映射到共享内存中,但是通过从映射内存区域的开头开始的特殊“偏移”指针进行寻址。

那么,内存映射文件和标准之间的情况是什么?

目前没有情况。它们不属于标准内存模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接