La taille des classes C++
Voici le code qui affiche la taille de différentes classes
#include <iostream>
using namespace std;
class EmptyClass
{
};
class AbstractClass
{
public:
virtual void funcOne() = 0;
virtual void funcTwo() = 0;
};
class NotAbstrClass
{
public: int virtFunc( int );
};
class MixClass
{
public:
virtual void clFunc( int );
static int i;
int j;
};
int main()
{
//Print size of class or class objects
cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;
cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
cout<<"Size of Mix class: "<< sizeof(MixClass)<<endl;
return 0;
}
La sortie du programme sur le C++11 compilateur est
Size of empty class: 1
Size of Abstract class :4
Size of Non Abstract class: 1
Size of Mix class: 8
Je comprends pourquoi Vide classe de taille a 1 La taille de vide de la classe de l'objet. Pour la classe abstraite, l'objet stocke un pointeur pour la mise en œuvre de fonction virtuelle mécanismes d'appel. Mais que dire de la taille d'autres objets de la classe (NotAbstrClass et MixClass) ?
Comprendre que tout ce que sizeof() vous dit est intrinsèquement dépendante de ce compilateur dans ce système d'exploitation et les paramètres.
vous avez raison à ce sujet. Mais pour le moment, considérez que je suis en utilisant 32 bits bureau de l'architecture du processeur avec un 32-bit OS. Dans de tels cas, vous pouvez utiliser le béton valeurs pour la taille des types d'entiers (4 octets), et un pointeur de type(4 octets).
double de stackoverflow.com/questions/4766323/...
Je sais que c'est une question stupide, et je pensais la même chose quand j'ai demandé ce genre de questions dans un entretien avec une entreprise de semi-conducteurs.
vous avez raison à ce sujet. Mais pour le moment, considérez que je suis en utilisant 32 bits bureau de l'architecture du processeur avec un 32-bit OS. Dans de tels cas, vous pouvez utiliser le béton valeurs pour la taille des types d'entiers (4 octets), et un pointeur de type(4 octets).
double de stackoverflow.com/questions/4766323/...
Je sais que c'est une question stupide, et je pensais la même chose quand j'ai demandé ce genre de questions dans un entretien avec une entreprise de semi-conducteurs.
OriginalL'auteur nurabha | 2013-06-24
Vous devez vous connecter pour publier un commentaire.
Selon Girish Shetty:
Ici il y a quelques site web lié, je pense qu'il peut être utile pour vous.
Déterminer la taille de la classe de l'objet: http://www.cprogramming.com/tutorial/size_of_class_object.html
Disposition de la mémoire: http://www.phpcompiler.org/articles/virtualinheritance.html
Et, si vous utilisez MVSC, vous pouvez vider la mémoire de la disposition de toutes les classes dans votre solution avec
-d1reportAllClassLayout
comme ça:Girish Shetty est l'auteur de l'article, premier lien que je vous renvoie ci-dessus. Donc, je donne son nom à titre de référence. 🙂
oh. Alright. Merci!
OriginalL'auteur HappyTran
NotAbstrClass
n'a pas de membres de données, de sorte qu'il est aussi une classe vide. Étant donné que les classes ne peuvent pas être de taille zéro, vous obtenez le même traitement que lesEmptyClass
.MixClass
a une fonction virtuelle, et 1 non-membre de données statiques. Il semble que chacun de ces (vptr
etint
) occupe 4 octets sur votre plate-forme, de sorte que la taille est de 8 octets.Vous avez répondu vous-même. La donnée membre statique est partagée entre toutes les instances de cette classe, et en tant que tel, il n'appartient pas à un individu quelconque instance. Si elle ne fait pas partie de n'importe quelle instance, comment peut-il ajouter à la taille de l'un?
OriginalL'auteur Praetorian
NotAbstrClass est comme une classe vide lorsque nous parlons peu de tailles, car il n'a pas de données.
MixClass a le virtuel pointeur de fonction (4 octets sur une machine 32 bits) et un int (4 octets).
OriginalL'auteur Marius