Duplicata 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;
}
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 (au moins) 1.
Pour garantir que les adresses de deux objets différents seront différentes. Pour la même raison, "nouveau" renvoie toujours des pointeurs vers des objets distincts.
Voir Stroustrup pour une réponse complète.
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 à cela.
Pour garantir que new
renverra toujours un pointeur vers une adresse mémoire distincte.
Pour éviter certaines divisions par zéro. Par exemple, l'arithmétique du pointeur (dont beaucoup sont effectuées automatiquement par le compilateur) implique 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 en parle aussi.
Classe sans aucun membre de données et fonction membre, ce type de classe est appelé classe vide. La taille de l'objet de la classe vide est toujours de 1 octet.
Lorsque nous créons un objet de n'importe quelle classe à ce moment, l'objet obtient toujours 3 caractéristiques, c'est-à-dire.
Lorsque nous créons un objet de classe vide à ce moment-là, l'état de cet objet n'est rien. Le comportement de cet objet n'est également rien, mais le compilateur attribue 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 la classe vide est de 1 octet.
Ce que Maurits et Péter ont dit.
Il est intéressant de noter dans ce contexte que les compilateurs peuvent faire une optimisation de classe de base vide (EBCO):
#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;
}
Cela affichera probablement "1,1" si vous le compilez et l'exécutez. Voir aussi Vandevoorde/Josuttis 16.2 sur EBCO.