2010-03-24 2 views
11

Les pointeurs sur un système 64 bits sont-ils toujours alignés sur 4 octets (similaire à un double sur un système 32 bits)? Ou sont-ils noter 8 octets alignés?C Alignement de pointeur 64 bits

Par exemple, sur un système 64 bits quelle est la structure de données suivante:

struct a { 
    void* ptr; 
    char myChar; 
} 

Serait aligné le pointeur de 8 octets, ce qui provoque 7 octets de remplissage pour le caractère (total = 8 + 8 = 16)? Ou le pointeur serait-il aligné sur 4 octets (4 octets + 4 octets) provoquant 3 octets de remplissage (total = 4 + 4 + 4 = 12)?

Merci, Ryan

+7

Pendant un instant, j'ai lu "C64". – Thilo

Répondre

6

L'alignement et le compactage des données sont spécifiques à l'implémentation et peuvent généralement être modifiés à partir des paramètres du compilateur (ou même avec des pragmas). Cependant, en supposant que vous utilisiez les paramètres par défaut, sur la plupart des compilateurs (sinon tous), la structure devrait atteindre un total de 16 octets. La raison en est que les ordinateurs lisent un bloc de données avec la taille de sa taille de mot native (qui est de 8 octets dans le système 64 bits). Si elle devait l'ajuster à des décalages de 4 octets, la structure suivante ne serait pas correctement complétée à une limite de 64 bits. Par exemple, dans le cas d'un arr [2], le deuxième élément du tableau commencerait à un décalage de 12 octets, qui n'est pas à la limite de l'octet natif de la machine.

6

Je ne pense pas que vous pouvez compter sur des règles strictes et rapides. Je pense que c'est une fonction du compilateur que vous utilisez et des options de compilation que vous choisissez. Votre meilleur pari est d'écrire un programme qui teste cela et recrache un fichier d'en-tête qui codifie les règles d'alignement comme #define s. Vous pourriez aussi calculer juste ce qui vous intéresse directement dans les macros.

3

générale sur un système 64 bits:

struct a { 
    void* ptr;  // size is 8 bytes, alignment is 8 
    char myChar; // size is 1 byte, alignment is 1 
        // padding of 7 bytes so array elements will be properly aligned 
} 

Pour une taille totale de 16 octets.

Mais tout cela est défini par l'implémentation - je donne juste un exemple qui pourrait être vrai pour beaucoup (la plupart?) De systèmes 64 bits.

0

Vous devriez consulter la documentation pour l'ABI particulier qui vous intéresse. Par exemple, voici the System V ABI x86-64 architeture supplement - vous pouvez voir à la page 12 que les pointeurs sur cet ABI sont alignés sur 8 octets (donc oui, la structure vous show serait rembourré à 16 octets).

1

La norme de langage ne fait aucune déclaration sur le remplissage. Les règles d'alignement sont spécifiques à la plate-forme (ie, vous devez aligner différemment sur un CPU PowerPC par exemple) et elles sont définies par l'implémentation, ce qui signifie que votre compilateur peut faire ce qui fonctionne (et peut changer ce comportement avec une commande différente options en ligne ou après une mise à jour de version).

Je crois fermement que toute recommandation le long des lignes de « ceci est généralement ceci ou cela » est trompeur, et peut-être dangereux.

  1. Vous pouvez écrire un programme de test qui exécute un couple de sizeof() et/ou offsetof() déclarations et écrit un en-tête pour vous contenant des #define s indiquant les rembourrages utilisés.Vous pouvez utiliser autoconf pour le faire pour vous. Au minimum, vous devez ajouter les instructions assert(sizeof(...)) au début de votre fonction main() afin d'être informé lorsque vos hypothèses sont fausses.