97 votes

Pourquoi la taille d'une classe vide en C ++ n'est-elle pas nulle?

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

Pourquoi la sortie suivante 1 ?

 #include <iostream>

class Test
{
};

int main()
{
    std::cout << sizeof(Test);
    return 0;
}
 

136voto

Péter Török Points 72981

La norme n'autorise pas les objets (et leurs classes) de taille 0, car cela permettrait à deux objets distincts d'avoir la même adresse mémoire. C'est pourquoi même les classes vides doivent avoir une taille d'au moins 1.

38voto

Maurits Rijk Points 4873

Pour s'assurer que les adresses de deux objets différents seront différentes. Pour la même raison, "nouveau" renvoie toujours les pointeurs sur des objets distincts.

Voir Stroustrup pour une réponse complète.

31voto

wilhelmtell Points 25504

La norme C++ garantit que la taille de toute la classe est au moins un. Le C++ standard indique qu'aucun objet ne doit avoir la même adresse mémoire comme un autre objet. Il y a plusieurs bonnes raisons pour cela.

  1. Pour garantir new toujours retourner un pointeur vers une mémoire distincte de l'adresse.

  2. Pour éviter certaines divisions par zéro. Par exemple, l'arithmétique de pointeur (qui fait automatiquement par le compilateur) impliquent en divisant par sizeof(T).

Notez cependant qu'il ne veut pas dire qu'une base vide-classe d'ajouter 1 à la taille d'une classe dérivée:

struct Empty { };

struct Optimized : public Empty {
    char c;
};

// sizeof(Optimized) == 1 with g++ 4.0.1

Bjarne Stroustrup en parle trop.

13voto

Shantanu Points 61

Classe sans les membres de données et la fonction de membre de ce type de classe est connue en tant que classe vide. La taille de l'objet de classe vide est toujours de 1 octet.

Quand on créer un objet d'une catégorie à l'époque l'objet obtient toujours les 3 caractéristiques à savoir

  1. État
  2. Comportement
  3. Identité

Quand on créer un objet de classe vide, à ce moment, l'État de cet objet n'est rien. Le comportement de cet objet n'est rien, mais le compilateur attribue une adresse unique pour l'objet. La mémoire de l'Ordinateur est toujours organisé sous la forme d'octets et le minimum de mémoire disponible à l'adresse d'objet de l'emplacement est de 1 octet. C'est pourquoi la taille de l'objet de classe vide est de 1 octet.

4voto

phresnel Points 20082

Ce Maurits et Péter dit.

Il est intéressant de noter dans ce contexte que les compilateurs peuvent faire vide de la classe de base de l'optimisation (EBCO):

#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
    std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;        
}

Ce sera probablement l'impression de "1,1" si vous compilez et exécutez-le. Voir aussi Vandevoorde/Josuttis 16.2 sur EBCO.

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