2010-11-07 7 views
0

Compte tenu de ces structures sur 64 bits:alignement des données et problèmes d'héritage

struct base 
{ 
    long a; 
}; 

struct derived : public base 
{ 
    long b; 
    char c; 
}; 

je reçois une taille de 24 et un avertissement de remplissage, mais je ne comprends pas pourquoi. Pour moi, les données avec ce genre d'héritage sont alignés comme

a 
b 
c 

Ainsi, un est aligné sur 8, b et c est trop char et est aligné sur 1. Alors, quel est le problème ici, pourquoi la taille est de 24?

+1

Veuillez également indiquer le compilateur que vous utilisez et le message d'avertissement exact. –

+0

que dit l'avertissement de remplissage? – jalf

Répondre

1

Parfois, le compilateur choisit d'utiliser une taille de mot pour tous les éléments afin d'améliorer la vitesse de fonctionnement. Dans GCC, par exemple, vous pouvez forcer l'alignement serré à l'aide

__attribute__((packed)) 

à la définition de struct. Vous pouvez étudier this GCC documenation. Cependant, je ne suis pas sûr des hypothèses que vous pouvez faire concernant l'alignement lorsque vous utilisez l'héritage. En particulier, si vous utilisez des fonctions virtuelles, la taille peut changer en raison de l'ajout de pointeurs à la structure.

8

La taille est 24 de sorte que lorsque vous créez un tableau de struct derived le deuxième élément du tableau aura l'alignement de 8 octets pour base::a.

+0

+1: Je n'avais certainement pas envisagé une telle possibilité. – Puppy

+0

Ah, ceci est un alignement de structure! Merci ! – fedj