9
votes

Quelle est la taille de cette classe et pourquoi?

J'ai deux classes comme suit

class A
{

};

class B
{
    int a[];
};


int main()
{
    cout << sizeof(A) <<endl;      //outputs 1
    cout << sizeof(B) <<endl;      //outputs 0
    return 0;
}


4 commentaires

La classe B ne doit pas compiler.


§8.3.4.1 Si l'expression constante (5.19) est présente, elle doit être une expression constante intégrale et sa valeur est supérieure à zéro.


@pushe quel compilateur utilisez-vous et quelle version?


En outre, COUT n'est-ce pas quelque chose que vous avez écrit vous-même, n'est-ce pas? Je veux dire, je ne vois aucune preuve de l'espace de noms STD utilisé ...


3 Réponses :


4
votes

Votre code est mal formé en ce qui concerne la langue C ++. En particulier, la classe B ne doit pas compiler dans le compilateur conforme standard C ++. Votre compilateur a l'un des bugs ou fournit cette fonctionnalité comme une extension.

GCC avec -pedantic-erreurs -std = c ++ 11 donne cette erreur: xxx


2 commentaires

@THOMAS: veuillez le compiler avec -std = c ++ 11-Erreurs , alors laissez-nous savoir.


Je l'ai compilé à vs2010 et il donne 1,1



6
votes

GCC permet des tableaux de longueur zéro comme une extension: http: //gcc.gnu .org / onlinedocs / gcc / zéro-longueur.html

et:

En tant qu'appariement de la mise en oeuvre d'origine des tableaux de longueur zéro, Tailleof évalue à zéro.


2 commentaires

Cela expliquerait Tailleof (B :: A) étant 0. Je ne pense pas que cela excuse tailleof (b) étant 0.


Je suppose que vous devriez supporter cela avec les développeurs de la GCC. Le point ne ment pas sur les résultats.



2
votes

La taille d'une classe vide n'est pas 1. C'est au moins 1 dans un système C ++. La raison en est que vous devez être capable, par exemple pour allouer une instance avec nouveau et avoir un pointeur non nul qui y est dirigé.

Le deuxième cas est plutôt invalide C ++.

Les fabricants de compilateurs souvent prennent une certaine liberté en permettant à des "extensions" non standard par défaut et d'essayer de vous faire les utiliser inconsciemment (un paranoïaque dirait de vous enfermer en rendant votre code inutilisable par d'autres compilateurs).


0 commentaires