Question

Je veux partager la mémoire entre les différents processus en cours d'exécution d'une DLL. Par conséquent, je crée un fichier de mémoire mappée par HANDLE hSharedFile = CreateFileMapping(...) puis LPBYTE hSharedView = MapViewOfFile(...) et LPBYTE aux = hSharedView

Maintenant, je veux lire un bool, un int, un float et un char du tableau aux. La lecture d'un bool et char est facile. Mais comment pourrais-je faire le tour de la lecture d'un int ou float? Notez que le int ou float pourraient commencer à la position 9 par exemple une position qui ne soit pas divisible par 4.

Je sais que vous pouvez lire un char[4] et memcpy ensuite dans un float ou int. Mais je vraiment besoin d'être très rapide. Je me demande s'il est possible de faire quelque chose avec des pointeurs?

Merci à l'avance

Était-ce utile?

La solution

Si vous le savez, par exemple, que les éléments du tableau aux [13..16] contiennent un flotteur, vous pouvez accéder à ce flotteur de plusieurs façons:

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

Autres conseils

Il n'y a rien de mal avec de saisir un int à l'offset 9:

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

int mynumber = *intptr;

Il pourrait y avoir une pénalité de performance vraiment minuscule pour cet accès « non alignés », mais il sera toujours correctement, et les chances de se faire remarquer des différences sont minces.

Tout d'abord, je pense que vous devriez mesurer. Il y a trois options que vous pouvez aller avec ce que je peux penser à:

  • avec la mémoire non alignée
  • avec memcpy dans des tampons
  • avec mémoire alignement personnalisé

mémoire Unaligned fonctionne très bien, il sera juste plus lent que aligné. Comment est plus lent que, et est-ce important pour vous? Mesurer pour savoir.

Copie dans un tampon sera un compromis entre les accès plus lent non alignés pour les opérations de copie supplémentaires. La mesure va vous dire si ça vaut le coup.

Si vous utilisez la mémoire non alignée est trop lent pour vous et que vous ne souhaitez pas copier les données autour de (peut-être en raison du coût de la performance), alors vous pouvez éventuellement faire plus vite en perdre un peu d'espace mémoire et en augmentant la complexité de votre programme. Ne pas utiliser la mémoire mappée aveuglément: autour de votre pointeur « de base » vers le haut à une valeur appropriée (par exemple 8 octets) et seulement les lectures / écritures par incréments de cette valeur « de base » 8 octets. Cela permettra d'assurer que tous vos accès seront alignés.

Mais ne mesure avant d'entrer dans tous ces problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top