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; }
- C ++: Quelle est la taille d'un objet d'une classe vide? (5 réponses )
Réponses
Trop de publicités?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.
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.
Pour garantir
new
toujours retourner un pointeur vers une mémoire distincte de l'adresse.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
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
- État
- Comportement
- 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.
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.