我最近开始了一个需要使用共享/命名内存的项目。我有一个工作原型 - 但在我承诺当前的实现之前,我想更多地了解这个主题。
我已经检查了MSDN文档(以及其他各种来源),并且我掌握了一切工作方式背后的基本原则,但我无法在下面找到我的问题的答案。
1)如果您创建共享内存空间并且没有提供有效的文件句柄,它会使用系统页面文件进行存储。我的问题是 - 如果我创建自己的文件,并将视图映射到该文件 - 性能是否与映射到系统页面文件时的性能相当?
2)您可以使用CopyMemory(创建数据副本)或将MapViewOfFile的结果转换为首先写入的类型来访问共享内存空间中的数据。我们假设我们编写了一个数据结构" MyStruct"那里。是否可以保存以下内容?
auto pReferenceToSharedMemory = (MyStruct*)MapViewOfFile(....);
pReferenceToSharedMemory->SomeField = 12345;
pReferenceToSharedMemory->SomeField2 = ...;
...
假设上述操作是安全的 - 将数据更改应用于存储在共享内存空间中的数据肯定比将数据复制出来更新,更改某些值并将其复制回来更有效吗?
3)最后 - OpenFileMapping和MapViewOfFile操作有多贵?我认为理想情况下你应该只执行一次OpenFileMapping(在操作开始时),执行一次MapViewOfFile,并使用它在整个操作中返回的引用,而不是每次要访问数据时都执行MapViewOfFile? / p>
最后: MapViewOfFile返回的引用和MapViewOfFile中存储的数据是否可能不同步?
答案 0 :(得分:1)
1)您自己的文件和系统页面文件之间的选择不是性能;它的持久性。下次程序运行时,对文件的更改仍然存在。
2)正确的解决方案是`new(MapViewOfFile(...))MyStruct,如果映射由页面文件支持,因此仍然是空的。
3)昂贵的操作是读写,而不是元操作。
4)我甚至不知道这意味着什么,所以我相当肯定答案是否定的。