2009-08-31 5 views
0

Je comprends l'alignement de la structure est « mise en œuvre spécifique », mais Je me demandais s'il y a un moyen simple de calculer l'alignement de la structure, par exemple:Y at-il un moyen simple (macro?) Pour dire l'alignement de la structure?

typedef struct 
{ 
    char c; 
    int i; 
} test; 

if sizeof(test) - (sizeof(char) + sizeof(int)) == 0 means alignment is 1 byte; 
if sizeof(test) - (sizeof(char) + sizeof(int)) == 1 means alignment is 2 bytes; 
// ...etc... 

est l'hypothèse ci-dessus fiable vrai?

Répondre

0

Si tout ce que vous voulez est une bonne première estimation, puis trouver transitive la taille maximale du plus grand membre non global dans la structure et les structures imbriquées

4

Votre méthode n'est pas fiable dans le cas général: si vous essayé sur cette struct:

typedef struct 
{ 
    int i1; 
    int i2; 
} test; 

il vous donnera zéro résultat, ce qui est probablement pas l'alignement.

Voici une méthode qui fonctionne, bien que:

#include <stddef.h> 

struct dummy 
{ 
    char x; 
    test t; 
}; 

size_t test_alignment = offsetof(struct dummy, t); 
+0

#include mannequin struct {x omble chevalier; int i; }; size_t test_alignment = offsetof (struct dummy, i); fait ci-dessus le travail? –

+0

Cela dépend de ce que vous entendez par "œuvres". Il définit test_alignment à l'alignement de 'i' dans' struct dummy'. Si c'est ce que vous voulez faire, alors cela fonctionne certainement. –

+0

Cela testerait l'alignement de type 'int' (je supposais que vous vouliez tester l'alignement du type' test'?) – caf

1

Et voici la macro que j'ai dans ma boîte à outils (en utilisant caf's technique) pour obtenir l'alignement d'un type:

#define ALIGNMENT_OF(t) offsetof(struct { char x; t dummy; }, dummy) 

Alors maintenant vous pouvez utiliser des expressions telles que:

typedef struct 
{ 
    char c; 
    int i; 
} test; 

size_t x = ALIGNMENT_OF(test); // will likely set x = 4 

Notez qu'un compilateur particulier peut prendre en charge un non intrinsèque standard que vous pourriez préférer utiliser (par exemple, MSVC a commencé à prendre en charge un __alignof() intrinsèque). Mon en-tête définit ALIGNMENT_OF() en utilisant cet intrinsèque s'il détecte un compilateur qui le supporte (bien que je ne sache honnêtement pas quel avantage l'intrinsèque fournit).

+0

Si je ne me trompe pas, votre macro a un comportement indéfini car 'offsetof' n'est pas requis pour travailler sur des structures anonymes passées comme un argument comme ça. Vous pouvez le corriger en écrivant vous-même la définition portable de 'offsetof' dans le corps de la macro. –

Questions connexes