【问题标题】:Reading different data types in shared memory在共享内存中读取不同的数据类型
【发布时间】:2011-01-09 14:12:38
【问题描述】:

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

现在我想从 aux 数组中读取 boolintfloatchar。阅读boolchar 很容易。但是我将如何阅读intfloat?请注意,intfloat 可以从位置 9 开始,例如一个不能被 4 整除的位置。

我知道你可以将char[4]memcpy 读成floatint。但我真的需要这个非常快。我想知道是否可以用指针做一些事情?

提前致谢

【问题讨论】:

  • hSharedView 有什么用?为什么不直接说 LPBYTE aux = MapViewOfFile(...)?
  • 没错,你可以这样做。我只是学会了用另一种方式做;)
  • 但是为什么只有一个冗余变量?您可以在其中添加更多内容:“LPBYTE 冗余 0 = hSharedView;LPBYTE 冗余 1 = 冗余 0;LPBYTE 辅助 = 冗余 1;”我只是在开玩笑——这就是你用 hSharedView 做的事情,而且看起来很傻。

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


【解决方案1】:

例如,如果您知道数组元素 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 写入位置 [13..16] 怎么样?
  • @sigvardsen: *(int *)&aux[13] = i;
【解决方案2】:

在偏移量 9 处抓取 int 没有任何问题:

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

int mynumber = *intptr;

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

【讨论】:

  • g++ 拒绝第一行。你必须说“int* intptr = (int*)&data[9];” (但无论如何 intptr 都是多余的——看我的回答。)
  • @TonyK 同意,你的答案更清楚。将缺少的演员添加到我的。
【解决方案3】:

首先,我认为你应该测量。我能想到的三个选项可供您选择:

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

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

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

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

但在遇到所有这些麻烦之前,请先进行测量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2018-09-23
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多