2009-12-20 5 views
2

J'ai une structure que je voudrais optimiser l'empreinte de. Si je comprends bien, le compilateur crée des structures en mémoire lorsque vous les définissez. Les types les plus grands doivent être déclarés en premier afin que les petits types puissent remplir les trous d'alignement.optimisation de la taille de la structure

J'ai lu l'article WikiPedia sur l'alignement de la structure des données et d'autres articles sur le sujet. Mais je ne suis toujours pas sûr, est-ce que ma commande actuelle est la plus optimale ou est-ce que je manque quelque chose?

Note: Mon compilateur ne prend pas en charge « #pragma pack »

Répondre

5

Non, cela devrait être l'ordre le plus optimal en fonction du comportement du compilateur commun (en gardant à l'esprit que la norme ne précise pas réellement comment les structures sont emballé par rapport aux espaces entre les éléments, bien qu'il garantisse que l'ordre est spécifié: voir '6.2.5 Types' du dernier projet C1x-n1425). Vous avez tous vos pointeurs à l'avant et tous vos caractères à l'arrière, donc vous trouverez probablement que, avec une taille de pointeur de quatre octets, vous aurez une structure de 19 ou 20 octets.

Vous pouvez facilement vérifier en insérant les lignes suivantes dans votre code:

printf ("Size of dbentry* is %d\n", sizeof (struct dbentry_s*)); 
printf ("Size of char* is %d\n", sizeof (char*)); 
printf ("Size of uns char is %d\n", sizeof (unsigned char)); 
printf ("Size of stucture is %d\n", sizeof (dbentry)); 

La raison pour laquelle je l'ai mis dans tous les chèques sizeof est de vous assurer d'avoir une information complète. Je suis bien conscient le sizeof(char) est toujours 1.

+2

Croyez ce gars dans les questions d'emballage, pour lui porte le nom "packs-diablo"! –

+3

La norme exige effectivement que les champs soient placés dans l'ordre dans lequel ils ont été déclarés. – caf

+0

@caf, je n'ai pas vraiment vu d'ordre dans le cadre de l'emballage, je pensais plutôt à emballer comme simplement les espaces (ou le manque d'espace) entre les éléments. Mais c'est un bon point donc je vais modifier la réponse en conséquence. – paxdiablo

1

Vous pourriez être intéressé à utiliser pahole et/ou Cruncher#. Les deux sont des outils qui analysent la disposition des structures en mémoire.

Référence: original Maciej Sinilo blog post à propos de Cruncher #.

+2

Oh mon dieu, celui-ci fait aussi allusion à "pack" à son nom! –

+0

Je suis désolé je n'ai pas compris:/ –

+0

Pak-osz. Est-ce que vous le prononcez Pa-kosz? –

Questions connexes