Frage

Ich möchte etwas Speicher zwischen verschiedenen Prozessen teilen eine DLL ausgeführt wird. Deshalb erstelle ich eine Memory-Mapped-Datei von HANDLE hSharedFile = CreateFileMapping(...) dann LPBYTE hSharedView = MapViewOfFile(...) und LPBYTE aux = hSharedView

Jetzt möchte ich eine bool lesen, ein int, ein float und char aus dem aux-Array. eine bool und char Lesen ist einfach. Aber wie würde ich eine int oder float gehen um zu lesen? Beachten Sie, dass die int oder float an Position beginnen konnte 9 z.B. eine Position, die nicht teilbare von 4 ist.

Ich weiß, dass Sie ein char[4] lesen und es dann memcpy in einem float oder int. Aber ich brauche das wirklich sehr schnell zu sein. Ich frage mich, ob es möglich ist, etwas mit Zeigern zu tun?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Wenn Sie wissen zum Beispiel, dass Array-Elemente aux [13..16] enthalten einen Schwimmer, dann können Sie diesen Schwimmer auf verschiedene Arten zugreifen:

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.)

Andere Tipps

Es ist nichts falsch mit Grabbing eine int bei Offset 9:

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

int mynumber = *intptr;

Es könnte eine wirklich kleine Leistungseinbuße für diesen „nicht ausgerichtet“ Zugang sein, aber es wird immer noch korrekt funktionieren, und die Chancen für Sie keine Unterschiede bemerken schlank.

Zunächst einmal, ich glaube, Sie messen sollen. Es gibt drei Optionen, die Sie mit gehen kann, dass ich mir vorstellen kann:

  • mit nicht ausgerichteten Speicher
  • mit memcpy in Puffer
  • mit individuell ausgerichteten Speicher

Unaligned Speicher wird gut funktionieren, wird es nur langsamer als ausgerichtet sind. Wie langsamer ist, dass, und macht es für Sie? Messen Sie erfahren.

in einen Puffer kopieren werden die langsamer nicht ausgerichtete Zugriffe für zusätzliche Kopiervorgänge abwägen. Messen wird Ihnen sagen, ob es lohnt sich.

Wenn unaligned Speicher mit für Sie zu langsam ist und Sie nicht wollen, Daten um kopieren (vielleicht wegen der Leistungskosten), dann können Sie möglicherweise schneller tun, indem Sie etwas Speicherplatz verschwenden und Ihr Programm die Komplexität zu erhöhen. Sie nicht den Bildspeicher verwenden blind: rund Ihre „Basis“ Zeiger nach oben auf einen geeigneten Wert (beispielsweise 8 Byte) und nur tun, liest / schreibt in 8-Byte-Inkrementen dieser „Basis“ Wert. Dadurch wird sichergestellt, dass alle Ihre Zugriffe ausgerichtet wird.

Aber Maßnahme tun, bevor Sie in all diese Probleme gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top