读取共享内存中的不同数据类型
-
08-10-2019 - |
题
我想在运行 DLL 的不同进程之间共享一些内存。因此我创建了一个内存映射文件 HANDLE hSharedFile = CreateFileMapping(...)
然后 LPBYTE hSharedView = MapViewOfFile(...)
和 LPBYTE aux = hSharedView
现在我想读一本 bool
, , A int
, , A float
和一个 char
来自 aux 数组。读一 bool
和 char
简单。但我该如何阅读 int
或者 float
?请注意, int
或者 float
可以从位置 9 开始,例如不能被 4 整除的位置。
我知道你可以阅读 char[4]
进而 memcpy
它变成一个 float
或者 int
. 。但我真的需要这个速度非常快。我想知道是否可以用指针做一些事情?
提前致谢
解决方案
例如,如果您知道数组元素 aux[13..16] 包含一个浮点数,那么您可以通过多种方式访问该浮点数:
float f = *(float*)&aux[13] ; // Makes a copy. The simplest solution.
float* pf = (float*)&aux[13] ; // Here you have to use *pf to access the float.
float& rf = *(float*)&aux[13] ; // Doesn't make a copy, and is probably what you want.
// (Just use rf to access the float.)
其他提示
抓住没有什么错 int
在偏移9:
int* intptr = (int*) &data[9];
int mynumber = *intptr;
这种“未对齐”的访问权限可能会受到非常微小的性能罚款,但是它仍然可以正常工作,并且您注意到任何差异的机会很小。
首先,我认为您应该衡量。您可以考虑三个选择:
- 与不一致的内存
- 和
memcpy
变成缓冲区 - 具有定制对准的内存
未对齐的内存会正常工作,它的速度比对齐的要慢。那速度慢,对您有重要意义吗?衡量找出答案。
复制到缓冲区将以较慢的未对准访问权限以进行其他复制操作进行权衡。测量会告诉您是否值得。
如果使用未对齐的内存对您来说太慢了,并且您不想复制数据(也许是由于性能成本),那么您可以通过浪费一些内存空间并提高程序复杂性来更快。不要盲目地使用映射的内存:将“基础”指针向上绕到合适的值(例如8字节),并且只能以该“基础”值的8字节增量读取/写入/写入。这将确保您的所有访问权限将保持对齐。
但是,在您遇到所有这些麻烦之前,请先衡量。