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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top