117 votes

C ++: Quelle est la taille d'un objet d'une classe vide?

Je me demandais ce que pourrait être la taille d'un objet d'une classe vide. Il n'aurait certainement pas être de 0 octets, car il devrait être possible de référence et le point comme n'importe quel autre objet. Mais, quelle est la taille d'un tel objet?

J'ai utilisé ce petit programme:

#include <iostream>
using namespace std;

class Empty {};

int main()
{
    Empty e;
    cerr << sizeof(e) << endl;
    return 0;
}

La sortie je suis sur Visual C++ et Cygwin-g++ compilateurs a 1 octet! C'était un peu surprenant pour moi car je m'attendais à ce qu'il soit de la taille de la machine mot (32 bits ou 4 octets).

Quelqu'un peut-il expliquer pourquoi la taille de 1 octet? Pourquoi pas 4 octets? Est-ce la dépend du compilateur et de la machine? Aussi, quelqu'un peut donner un plus convaincante de la raison pour laquelle une classe vide de l'objet ne va pas être de la taille de 0 octets?

138voto

Sol Points 1292

En citant la FAQ sur le style et la technique C ++ de Bjarne Stroustrup , la raison pour laquelle la taille est différente de zéro est "Pour garantir que les adresses de deux objets différents seront différentes." Et la taille peut être 1 parce que l'alignement n'a pas d'importance ici, car il n'y a rien à regarder.

32voto

TrayMan Points 3586

La norme indique que sizeof ()> = 1 est présent dans la plupart des objets dérivés.

Sauf s'il s'agit d'un champ de bits (class.bit), un objet le plus dérivé doit avoir une taille non nulle et occuper un ou plusieurs octets de stockage. Les sous-objets de classe de base peuvent avoir une taille nulle. ISO / IEC FDIS 14882: 1998 (E) intro.object

17voto

paxdiablo Points 341644

C'est vraiment un détail d'implémentation. J'ai d'abord pensé qu'il pourrait être de zéro octets à des dizaines de milliers d'octets, qu'il n'a pas d'incidence sur la spécification du langage. Mais, après avoir regardé la norme (section 5.3.3), il semble que l' sizeof faut toujours en revenir 1 ou plus, n'importe quoi.

La taille de la plupart de la classe dérivée doit être supérieure à zéro.

La raison pourquoi il ne peut pas être une machine word est qu'il n'existe pas d'éléments au sein de ce qui l'obligent à être alignée sur une frontière de mot (comme un entier). Par exemple, si vous placez char x; int y; à l'intérieur de la classe, mon GCC horloges à huit octets (depuis la seconde int doivent être alignés).

5voto

lalatendu Points 51

Même s'il n'est pas nécessaire d'assigner de la mémoire pour une classe vide, mais pour créer des objets de classes vides, le compilateur attribue la mémoire minimale pouvant être affectée, à savoir 1 octet. De cette façon, le compilateur peut distinguer de manière unique deux objets de la même classe vide et sera en mesure d'affecter l'adresse de l'objet à un pointeur du type de classe vide.

4voto

Je pense qu’il pourrait être utile de faire un lien vers une réponse expliquant ce bien trop. C’est sur `` par Logan Capaldo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X