我想在运行 DLL 的不同进程之间共享一些内存。因此我创建了一个内存映射文件 HANDLE hSharedFile = CreateFileMapping(...) 然后 LPBYTE hSharedView = MapViewOfFile(...)LPBYTE aux = hSharedView

现在我想读一本 bool, , A int, , A float 和一个 char 来自 aux 数组。读一 boolchar 简单。但我该如何阅读 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字节增量读取/写入/写入。这将确保您的所有访问权限将保持对齐。

但是,在您遇到所有这些麻烦之前,请先衡量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top