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; }
3 Réponses :
Votre code est mal formé en ce qui concerne la langue C ++. En particulier, la classe GCC avec B code> ne doit pas compiler dans le compilateur conforme standard C ++. Votre compilateur a l'un des bugs ou fournit cette fonctionnalité comme une extension.
-pedantic-erreurs -std = c ++ 11 code> donne cette erreur: p>
@THOMAS: veuillez le compiler avec -std = c ++ 11-Erreurs code>, alors laissez-nous savoir.
Je l'ai compilé à vs2010 et il donne 1,1
GCC permet des tableaux de longueur zéro comme une extension: http: //gcc.gnu .org / onlinedocs / gcc / zéro-longueur.html p>
et: p>
En tant qu'appariement de la mise en oeuvre d'origine des tableaux de longueur zéro, Tailleof évalue à zéro. p> blockQuote>
Cela expliquerait Tailleof (B :: A) Code> étant 0. Je ne pense pas que cela excuse
tailleof (b) code> é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.
La taille d'une classe vide n'est pas 1. C'est au moins fort> 1 dans un système C ++.
La raison en est que vous devez être capable, par exemple pour allouer une instance avec Le deuxième cas est plutôt invalide C ++. P>
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). P> nouveau code> et avoir un pointeur non nul qui y est dirigé. P>
La classe
B code> 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 code> 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é ...