在共享内存中读取不同的数据类型

时间:2011-01-09 14:12:39

标签: c++ byte memcpy memory-mapped-files

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

现在我想从aux数组中读取boolintfloatchar。阅读boolchar很简单。但是,如何阅读intfloat?请注意,intfloat可以从第9位开始,例如一个不能被4分割的职位。

我知道您可以将char[4]然后memcpy读成floatint。但我真的需要这个非常快。我想知道是否有可能用指针做某事?

提前致谢

3 个答案:

答案 0 :(得分: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.)

答案 1 :(得分:2)

在偏移9处抓取int没有错:

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

int mynumber = *intptr;

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

答案 2 :(得分:1)

首先,我认为你应该衡量。我能想到的有三种选择:

  • 内存不对齐
  • memcpy放入缓冲区
  • 使用自定义对齐内存

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

复制到缓冲区将权衡较慢的未对齐访问以进行其他复制操作。测量会告诉你它是否值得。

如果使用未对齐的内存对你来说太慢而且你不想复制数据(可能是因为性能成本),那么你可以通过浪费一些内存空间和提高程序复杂性来加快速度。不要盲目使用映射的内存:将“基”指针向上舍入到合适的值(例如8个字节),并且仅以此“基”值的8字节增量进行读/写操作。这将确保您的所有访问都是一致的。

但是在你遇到这些麻烦之前要做一些测量。