我想在运行DLL的不同进程之间共享一些内存。因此,我按HANDLE hSharedFile = CreateFileMapping(...)
创建了一个内存映射文件,然后LPBYTE hSharedView = MapViewOfFile(...)
和LPBYTE aux = hSharedView
现在我想从aux数组中读取bool
,int
,float
和char
。阅读bool
和char
很简单。但是,如何阅读int
或float
?请注意,int
或float
可以从第9位开始,例如一个不能被4分割的职位。
我知道您可以将char[4]
然后memcpy
读成float
或int
。但我真的需要这个非常快。我想知道是否有可能用指针做某事?
提前致谢
答案 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字节增量进行读/写操作。这将确保您的所有访问都是一致的。
但是在你遇到这些麻烦之前要做一些测量。