Travailler avec des enregistrements compacts

La plupart des compilateurs utilisent une stratégie d'alignement des données en mémoire qui optimise la vitesse d'accès aux données.Cela signifie, habituellement, un alignement des données sur la taille d'un mot mémoire, ou encore compacter les données pour mieux utiliser l'antémémoire (la mémoire cache), selon les cas.

Pour diverses raisons (dont la réduction des Cache Misses), il peut arriver que vous souhaitiez travailler avec des données plus compactes en mémoire. En retour, pour des raisons d'alignement, il se peut que de forcer un enregistrement à être représenté de manière compacte soit carrément dangereux. Agissez avec prudence.

#include <iostream>
#include <cstddef>
using namespace std;
bool est_compact()
{
   struct X { char c; int i; };
   return offsetof(X,i)==sizeof(char);
}
int main ()
{
   cout << boolalpha << "Compact? "
        << est_compact()
        << noboolalpha << endl;
}

Une manière simple de vérifier, dans la majorité des cas, si votre compilateur génère du code compact ou non est d'utiliser la macro offsetof() rendue disponible par <cstddef> et qui retourne la distance en octets entre le début d'un enregistrement et l'un de ses membres.

En insérant un char (dont la taille est probablement inférieure à celle d'un mot mémoire) en début d'enregistrement et en le faisant suivre d'une autre donnée, il est possible de vérifier si les enregistrements générés par le compilateur sont compacts ou non: il suffit de tester si la distance entre le second membre de l'enregistrement et le début de cet enregistrement équivaut à la taille d'un char. Si c'est le cas, alors l'enregistrement est compact.

Tous les compilateurs offrent l'option d'aligner les données de manière plus compacte (par exemple de les aligner sur la frontière d'un seul byte). Dans Visual Studio, typiquement, on parle de propriétés du projet. Faire ce choix peut entraîner une dégradation de la performance à l'exécution, alors ne le faites pas sans tester rigoureusement les conséquences de votre décision!


Valid XHTML 1.0 Transitional

CSS Valide !