1

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

现在我想从 aux 数组中读取 a bool、 a int、 afloat和 a 。char阅读boolchar很容易。但是我将如何阅读 a intor float?注意intorfloat可以从位置 9 开始,例如一个不能被 4 整除的位置。

我知道你可以读 achar[4]然后memcpy把它读成 a floator int。但我真的需要这个非常快。我想知道是否可以用指针做一些事情?

提前致谢

4

3 回答 3

3

例如,如果您知道数组元素 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.)
于 2011-01-09T14:24:38.667 回答
2

int在偏移量 9 处抓取一个并没有错:

int* intptr = (int*) &data[9];

int mynumber = *intptr;

这种“未对齐”访问可能会有非常小的性能损失,但它仍然可以正常工作,并且您注意到任何差异的机会很小。

于 2011-01-09T14:21:06.673 回答
1

首先,我认为你应该测量。我可以想到三个选项:

  • 内存未对齐
  • 进入memcpy缓冲区
  • 带有自定义对齐的内存

未对齐的内存可以正常工作,只是比对齐的要慢。这有多慢,对你来说重要吗?测量以找出答案。

复制到缓冲区将用较慢的未对齐访问来换取额外的复制操作。测量会告诉你是否值得。

If using unaligned memory is too slow for you and you don't want to copy data around (perhaps because of the performance cost), then you can possibly do faster by wasting some memory space and increasing your program complexity. Don't use the mapped memory blindly: round your "base" pointer upwards to a suitable value (e.g. 8 bytes) and only do reads/writes at 8-byte increments of this "base" value. This will ensure that all your accesses will be aligned.

But do measure before you go into all this trouble.

于 2011-01-09T14:29:29.143 回答