La lectura de diferentes tipos de datos en la memoria compartida
-
08-10-2019 - |
Pregunta
Quiero compartir algo de memoria entre los diferentes procesos que se ejecutan una DLL. Por lo tanto creo un mapeado en memoria de archivos por HANDLE hSharedFile = CreateFileMapping(...)
continuación LPBYTE hSharedView = MapViewOfFile(...)
y LPBYTE aux = hSharedView
Ahora quiero leer un bool
, un int
, un float
y una char
de la matriz aux. La lectura de un bool
y char
es fácil. Pero ¿cómo iba a ir por la lectura de un int
o float
? Tenga en cuenta que la int
o float
podrían comenzar en la posición 9, por ejemplo, una posición que no es divisible por 4.
Sé que se puede leer un char[4]
y luego memcpy
en un float
o int
. Pero realmente necesito que esto sea muy rápido. Me gustaría saber si es posible hacer algo con los punteros?
Gracias de antemano
Solución
Si conoce, por ejemplo, que los elementos de la matriz aux [13..16] contener un flotador, entonces se puede acceder a este flotador de varias maneras:
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.)
Otros consejos
No hay nada malo con el acaparamiento de un int
en el desplazamiento 9:
int* intptr = (int*) &data[9];
int mynumber = *intptr;
Podría haber una muy pequeña penalización en el rendimiento de este acceso "no alineados", pero todavía funcionará correctamente, y las posibilidades de que te des cuenta las diferencias son escasas.
En primer lugar, creo que se debe medir. Hay tres opciones que puede ir con lo que puedo pensar en:
- con la memoria no alineada
- con
memcpy
en buffers - con la memoria a medida alineados
memoria Unaligned trabajo fino voluntad, sólo será más lenta que alinea. ¿Cómo es que más lenta, y qué es importante para usted? Medir para averiguar.
Copia en un búfer será el comercio fuera más lento de los accesos no alineados para operaciones de copia adicionales. Midiendo le dirá si vale la pena.
Si se utiliza la memoria no alineada es demasiado lento para usted y usted no desea copiar los datos en torno a (tal vez debido al costo de rendimiento), entonces posiblemente puede hacer más rápido por perder un poco de espacio de memoria y el aumento de su complejidad del programa. No utilice la memoria asignada a ciegas: ronda el puntero "base" hacia arriba a un valor adecuado (por ejemplo, 8 bytes) y sólo hacer lecturas / escrituras en incrementos de 8 bytes de este valor "base". Esto asegurará que se alinearán todos sus accesos.
Pero hacerlo medida antes de entrar en todo este problema.