共有メモリのさまざまなデータ型を読み取ります
-
08-10-2019 - |
質問
DLLを実行しているさまざまなプロセス間でメモリを共有したいと思います。したがって、メモリマップファイルを作成します HANDLE hSharedFile = CreateFileMapping(...)
それから LPBYTE hSharedView = MapViewOfFile(...)
と LPBYTE aux = hSharedView
今、私は読みたいです bool
, 、a int
, 、a float
そしてa char
AUXアレイから。読むa bool
と char
は簡単だ。しかし、どのように読んで回るのでしょうか int
また float
?に注意してください int
また float
位置9で始めることができます。
私はあなたが読むことができることを知っています char[4]
その後 memcpy
それはaに 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;
この「整理されていない」アクセスに対して本当に小さなパフォーマンスペナルティがあるかもしれませんが、それでも正しく機能し、違いに気付く可能性はわずかです。
まず第一に、私はあなたが測定すべきだと思います。私が考えることができる3つのオプションがあります:
- 整理されていないメモリ付き
- と
memcpy
バッファーに - カスタム整列メモリ付き
整理されていないメモリは正常に動作し、アライメントよりも遅くなります。それはどれくらい遅いですか、そしてそれはあなたにとって重要ですか?調べるために測定します。
バッファーにコピーすると、追加のコピー操作のために遅い整理されていないアクセスがトレードオフされます。測定すると、それが価値があるかどうかがわかります。
整理されていないメモリを使用することが遅すぎて、データをコピーしたくない場合(おそらくパフォーマンスコストのため)、メモリスペースを無駄にしてプログラムの複雑さを高めることで、より速くすることができます。マッピングされたメモリを盲目的に使用しないでください。「ベース」ポインターを適切な値(8バイトなど)に上に回転させ、この「ベース」値の8バイトの増分で読み取り/書き込みのみを行います。これにより、すべてのアクセスが揃うことが保証されます。
しかし、あなたがこのすべてのトラブルに入る前に測定してください。