Quelle est la plus petite taille que je puisse réaliser sur une machine 64 bits?

typedef struct node{ char one; char two; struct node *next; } nodea; 

Je pense en termes de rembourrage du compilateur, y at-il un moyen de réduire la taille de (nodée) à 16?

Vous pouvez utiliser la directive du compilateur #pragma pack http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

  #pragma pack(push) #pragma pack(1) typedef struct node { char one; char two; struct node* next; } nodea; #pragma pack(pop) 

À moins que ce ne soit non conventionnel, il peut être compressé dans 1 + 1 + 8 = 10 octets. Si les pointeurs doivent être alignés, alors 16 octets. Si vous placez le pointeur en premier et les caractères ensuite, puis 10 octets, mais les exigences d’alignement peuvent quand même être de 16 lorsque vous créez un tableau de ces structures.

Vous pouvez lui atsortingbuer 10 octets si vous le compressez, en supposant que le matériel sous-jacent ne nécessite pas d’alignement particulier. Sachez qu’une fois que vous commencez à emballer, vous quittez la portabilité.

La manière d’affecter l’emballage dépend de votre compilateur, mais la plupart des compilateurs, y compris gcc , prennent en charge #pragma pack directives de type #pragma pack .

Ceci dépend du compilateur. Généralement, vous pouvez contrôler l’alignement des champs / variables de la structure. Par exemple, avec gcc, vous pouvez utiliser

 typedef struct __atsortingbute__ ((packed)) node { char one; char two; struct node *next; } nodea; 

obtenir 10 pour sizeof(nodea) sur une plate-forme 64 bits.

Utiliser pack sur une structure signifierait également que le compilateur ne peut pas réorganiser la structure de données. Sur certaines plates-formes, le compactage peut entraîner une diminution considérable des performances. Certains processeurs ne peuvent pas obtenir de mots non alignés. Ainsi, si le code était compilé sur cette plate-forme, le compilateur serait obligé d’obtenir le mot par octet et de tout déplacer au bon endroit, c’est certainement quelque chose que vous ne voulez pas. Surtout pas sur une liste chaînée car cela rendrait votre liste vraiment très lente à accéder … Et même si le cpu supporte non aligné, le processeur aurait besoin de faire des cycles supplémentaires pour lire 2 adresses en mémoire et les concatater à nouveau.

C’est pourquoi vous devez regarder comment vous pouvez aider le compilateur. Vous voudriez que votre structure soit alignée mot pour que l’adresse du prochain nœud puisse toujours être lue avec une seule instruction de lecture. Cela voudrait dire que pour une architecture 64 bits, vous voudriez placer le pointeur du nœud suivant sur le dessus afin que celui-ci soit toujours aligné, ensuite vous voudrez vous assurer que si vous utilisez la structure dans un tableau, l’adresse de la struct node * toujours être aligné, vous devez donc vous assurer que la taille de votre structure finale est un multiple de 8 octets. Cela signifie que vous pouvez append 6 éléments supplémentaires ou choisir un type de données plus grand.

Cela signifierait que vous obtiendriez quelque chose comme ceci:

 typedef struct __atsortingbute__((packed)) node { struct node *next; char data[8]; } nodea; typedef struct __atsortingbute__((packed)) node { struct node *next; uint16_t data[4]; } nodea; typedef struct __atsortingbute__((packed)) node { struct node *next; uint32_t data[2]; } nodea; 

etc. etc. etc.