Pourquoi est la taille d'une classe vide en C++ pas de zéro? [dupliquer]

Double 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;
}
60
demandé sur Community 2010-03-02 12:34:00

5 réponses

la norme ne permet pas aux 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 de (au moins) 1.

97
répondu Péter Török 2010-03-02 09:43:51

Pour s'assurer que les adresses de deux différents objets sont différents. Pour la même raison, "Nouveau" toujours renvoie des pointeurs vers des objets distincts.

Voir Stroustrup pour la réponse complète.

30
répondu Maurits Rijk 2018-04-21 20:11:01

la norme C++ garantit que la taille de n'importe quelle classe est au moins une. La norme c++ stipule qu'aucun objet ne doit avoir la même adresse mémoire qu'un autre objet. Il y a plusieurs bonnes raisons pour cela.

  1. pour garantir que new retournera toujours un pointeur à une adresse mémoire distincte.

  2. pour éviter certaines divisions par zéro. Par exemple, l'arithmétique de pointeur (dont beaucoup fait automatiquement par le compilateur) impliquent la division par sizeof(T) .

notez cependant que cela ne signifie pas qu'une classe de base vide ajoutera 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 parle de ce aussi.

22
répondu wilhelmtell 2014-02-28 20:27:19

classe sans aucun membre de données et fonction de membre ce type de classe est connu comme classe vide. La taille de l'objet de classe vide est toujours de 1 octet.

lorsque nous créons un objet de n'importe quelle classe à ce moment-là, l'objet reçoit toujours 3 Caractéristiques, c'est-à-dire

  1. État
  2. comportement
  3. identité

lorsque nous créons un objet de classe vide à ce moment-là État de ce l'objet n'est rien. Le comportement de cet objet est aussi Rien, mais le compilateur assigne une adresse unique à cet objet. La mémoire dans L'ordinateur est toujours organisée sous forme d'octets et la mémoire minimale disponible à l'emplacement de l'adresse de l'objet est de 1 octet. C'est pourquoi la taille de l'objet de classe vide est de 1 octet.

10
répondu Shantanu 2011-10-18 05:57:26

ce que Maurits et Péter ont dit.

il est intéressant de noter dans ce contexte que les compilateurs peuvent faire l'optimisation des classes de base vides (EBCO):

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

cela imprimera probablement" 1,1 " si vous le compilez et l'exécutez. Voir aussi Vandevoorde / Josuttis 16.2 sur EBCO.

3
répondu Sebastian Mach 2010-03-02 09:54:52