1

DLL を実行している異なるプロセス間でメモリを共有したいと考えています。したがって、それまでにメモリマップファイルを作成HANDLE hSharedFile = CreateFileMapping(...)LPBYTE hSharedView = MapViewOfFile(...)LPBYTE aux = hSharedView

boolここで、 a 、 a int、 a 、 floata をcharaux 配列から読み取りたいと思います。boola andの読み方charは簡単です。しかし、どのように or を読みまわすのでしょうintfloat? intorは 9 の位置から開始できることに注意してくださいfloat。たとえば、4 で割り切れない位置です。

char[4]aを読み取ってからまたはmemcpyに変換できることは知っています。しかし、私は本当にこれを非常に高速にする必要があります。ポインターで何かできるかどうか疑問に思っていますか?floatint

前もって感謝します

4

3 に答える 3

3

たとえば、配列要素aux [13..16]にfloatが含まれていることがわかっている場合は、いくつかの方法でこのfloatにアクセスできます。

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

まず、測定する必要があると思います。私が考えることができるあなたが行くことができる3つのオプションがあります:

  • アライメントされていないメモリ
  • memcpyバッファに
  • カスタムアライメントメモリ付き

アライメントされていないメモリは問題なく動作しますが、アライメントされているよりも遅くなります。それはどれくらい遅いですか?それはあなたにとって重要ですか?測定して調べます。

バッファーへのコピーは、追加のコピー操作のために低速の非境界整列アクセスと引き換えになります。測定すれば、価値があるかどうかがわかります。

アライメントされていないメモリの使用が遅すぎて、(おそらくパフォーマンス コストのために) データをコピーしたくない場合は、メモリ スペースをいくらか浪費し、プログラムの複雑さを増すことで、より高速に実行できる可能性があります。マップされたメモリを盲目的に使用しないでください。「ベース」ポインタを適切な値 (たとえば 8 バイト) に丸め、この「ベース」値の 8 バイト単位でのみ読み取り/書き込みを行います。これにより、すべてのアクセスが整列されます。

しかし、このすべての問題に入る前に測定してください。

于 2011-01-09T14:29:29.143 に答える