web-dev-qa-db-fra.com

Comment trouver la taille d'une structure?

struct a
{
    char *c;
    char b;
};

Quelle est la taille de (a)?

27
praveen
#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}

J'obtiens "sizeof (a) == 8", sur une machine 32 bits. La taille totale de la structure dépendra de l'emballage: dans mon cas, l'emballage par défaut est 4, donc 'c' prend 4 octets, 'b' prend un octet, laissant 3 octets de remplissage pour l'amener au multiple suivant de 4 : 8. Si vous souhaitez modifier cet emballage, la plupart des compilateurs ont un moyen de le modifier, par exemple, sur MSVC:

#pragma pack(1)
typedef struct { char* c; char b; } a;

donne sizeof (a) == 5. Si vous faites cela, veillez à réinitialiser l'emballage avant les en-têtes de bibliothèque!

33
Simon Buchan

Contrairement à ce que certaines des autres réponses ont dit, sur la plupart des systèmes, en l'absence d'une option pragma ou compilateur, la taille de la structure sera d'au moins 6 octets et, sur la plupart des systèmes 32 bits, 8 octets. Pour les systèmes 64 bits, la taille peut facilement être de 16 octets. L'alignement entre en jeu; toujours. La taille d'une seule structure doit être telle qu'un tableau de ces tailles puisse être alloué et que les membres individuels du tableau soient suffisamment alignés pour le processeur en question. Par conséquent, si la taille de la structure était de 5 comme d'autres l'ont supposé, un tableau de deux de ces structures aurait une longueur de 10 octets et le pointeur char dans le deuxième membre du tableau serait aligné sur un octet impair, ce qui (sur la plupart des processeurs) provoquent un goulot d'étranglement majeur dans les performances.

9
Jonathan Leffler

Si vous souhaitez le compter manuellement, la taille d'une structure est juste la taille de chacun de ses membres de données après prise en compte de l'alignement. Il n'y a pas d'octets de surcharge magique pour une structure.

4
Jeff Hubbard

La valeur exacte est sizeof (a).
Vous pouvez également prendre un risque et supposer qu'il s'agit dans ce cas d'au moins 2 et d'au plus 16.

2
eugensk00

Cela variera en fonction de votre architecture et de la façon dont elle traite les types de données de base. Cela dépendra également si le système nécessite un alignement naturel.

1
mdec

Je suppose que vous voulez dire struct et pas strict, mais sur un système 32 bits, ce sera soit 5 ou 8 octets, selon que le compilateur remplit la structure.

0
Cody Brocious

Je suppose que vous voulez dire "struct", pas "strict" et "char" au lieu de "Char".

La taille dépendra de l'implémentation. Sur la plupart des systèmes 32 bits, ce sera probablement de 5 à 4 octets pour le pointeur, un pour le caractère. Je ne crois pas que l'alignement entrera en jeu ici. Cependant, si vous avez échangé "c" et "b", la taille peut atteindre 8 octets.

Ok, je l'ai essayé (g ++ 4.2.3, avec l'option -g) et j'obtiens 8.

0
Fred Larson

La taille de la structure doit être de 8 octets sur un système 32 bits, de sorte que la taille de la structure devient multiple de 2. Cela rend les structures individuelles disponibles aux limites d'octets correctes lorsqu'un tableau de structures est déclaré. Ceci est réalisé en complétant la structure avec 3 octets à la fin.

Si la structure avait le pointeur déclaré après le caractère, sa taille serait toujours de 8 octets, mais le remplissage de 3 octets aurait été ajouté pour garder le pointeur (qui est un élément de 4 octets) aligné à une limite d'adresse de 4 octets.

La règle générale est que les éléments doivent être à un décalage qui est le multiple de leur taille d'octet et la structure elle-même doit être d'une taille qui est un multiple de 2.

0
computinglife