Domanda

voglio condividere qualche ricordo tra i vari processi in esecuzione una DLL. Quindi ho creato un mappato in memoria file da HANDLE hSharedFile = CreateFileMapping(...) poi LPBYTE hSharedView = MapViewOfFile(...) e LPBYTE aux = hSharedView

Ora voglio leggere un bool, un int, un float e un char dalla matrice aux. La lettura di un bool e char è facile. Ma come faccio a andare in giro a leggere un int o float? Si noti che la int o float potrebbe iniziare nella posizione 9 esempio una posizione che non è divisibile per 4.

So che può leggere un char[4] e poi memcpy in una float o int. Ma ho davvero bisogno di questo per essere molto veloce. Mi chiedo se è possibile fare qualcosa con i puntatori?

Grazie in anticipo

È stato utile?

Soluzione

Se si conosce, ad esempio, che gli elementi dell'array aux [13..16] contengono un galleggiante, allora si può accedere a questo galleggiante in diversi modi:

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

Altri suggerimenti

Non c'è niente di sbagliato con afferrando un int all'offset 9:

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

int mynumber = *intptr;

Ci potrebbe essere una pena veramente piccola delle prestazioni per questo accesso "non allineato", ma continuerà a funzionare correttamente, e le probabilità di voi notando le differenze sono sottili.

Prima di tutto, penso che si dovrebbe misurare. Ci sono tre opzioni si può andare con che mi viene in mente:

  • con la memoria non allineati
  • con memcpy nei buffer
  • con la memoria su misura allineato

Memoria Unaligned lavoro sarà bene, sarà solo più lento di allineato. Quanto più lenta è che, e non importa a te? Misura per scoprirlo.

Copia in un buffer evolve fuori gli accessi più lento non allineati per operazioni di copia aggiuntive. Misurare vi dirà se ne vale la pena.

Se si utilizza la memoria non allineato è troppo lento per te e non si desidera copiare i dati in giro (forse a causa del costo delle prestazioni), allora si può eventualmente fare più velocemente di sprecare un po 'di spazio di memoria e aumentare il la complessità del programma. Non usare la memoria mappata alla cieca: rotondo il puntatore "base" verso l'alto per un valore adeguato (per esempio 8 byte) e solo fare letture / scritture con incrementi di 8 byte di questo valore "base". Questo farà sì che tutti i vostri accessi saranno allineati.

Ma fare misura prima di andare in tutti questi guai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top