8
votes

Quel est le mécanisme de taille de () en C / C ++?

Il semble que la taille de la taille n'est pas une fonction réelle?

Par exemple, si vous écrivez comme ceci: xxx

Vous pouvez obtenir une sortie comme: < pré> xxx

et lorsque vous creusez dans le code d'assemblage, vous trouverez STH comme ceci: xxx

donc, le compilateur mis directement la constante "4" Comme paramètres d'impression, appellent appelez-le. Ensuite, qu'est-ce que la taille de faire?


1 commentaires

Notez que l'expression transmise à la taille de papier n'est pas évaluée, donc je le fait pas pré-incrément. On dirait une belle façon d'introduire un bug dans (ou d'obsciser) du code.


9 Réponses :


8
votes

Tailleof analyse l'expression transmise pour trouver son type. Il retourne ensuite la taille du type.

Parce que la taille d'un type est toujours connue au moment de la compilation, il est mis dans le code de la machine comme une constante.


1 commentaires

+1 en C ++ et pré-C99. En C99, la taille d'un type n'est pas toujours connue au moment de la compilation: vide f (int n) {int gray [n]; printf ("% d \ n", tailleOf (tableau)); } . Dans ce cas, la taille de la matrice n'est pas connue au moment de la compilation mais au moment de l'exécution.



0
votes

exactement ce que c'est censé faire: met directement la constante "la taille de la variable / constante / type / etc. dans le code


0 commentaires

2
votes

Il est remplacé par la constante (4 dans votre cas) au moment de la compilation. Parce qu'il faut 4 octets pour tenir un int sur votre plate-forme.

et votre code ne compilera pas, au lieu de vous donner une sortie ;-) à cause de sizoef ; -)


1 commentaires

BTW, cela dépend de la mise en œuvre, mais je doute que la plupart d'entre eux produiront des appels à _printf lorsque vous effectuez Opérateur <<< / code> pour COUT.



1
votes

La taille du type retourné est calculée au moment de la compilation, il n'y a pas de surcharge d'exécution


0 commentaires

0
votes

Taillef () renvoie la taille en octets de tout ce que vous transmettez comme un argument. Dans une architecture de 32 bits, la taille de l'architecture (int) reviendrait 4, tandis que Tailleof (Char) retournerait 1.


0 commentaires

34
votes

Vous savez, il y a une raison pour laquelle il y a standard Documents (3,8 Mo de PDF) ; C99, section 6.5.3.4, §2:

Le Tailleof L'opérateur donne la taille (en octets) de son opérande, qui peut être une expression ou la parenthèseisation Nom d'un type. La taille est déterminée du type de l'opérande. Les Le résultat est un entier. Si le type de L'opérande est un tableau de longueur variable type, l'opérande est évalué; Sinon, l'opérande n'est pas évalué et le résultat est un entier constante .


En réponse au commentaire de Iberread, voici un exemple pour le boîtier de la variable de variable C99: xxx

la taille de FOO < / code> n'est plus connu au moment de la compilation et doit être déterminé au moment de l'exécution. L'assemblage généré a l'air assez étrange, alors ne me pose donc pas de questions sur les détails de la mise en œuvre ...


4 commentaires

Il y a aussi une raison pour laquelle Stackoverflow.com existe.


@jalf: "Apprends un homme à pêcher et vous le nourrissez pendant une vie. Sauf s'il n'aime pas Sushi, vous devez également lui apprendre à cuisiner." - ou quelque chose ;)


Donc, existe-t-il un exemple pour montrer que "Type de réseau de longueur variable"?


Peut-être pas immédiatement évident de l'extrait ci-dessus, de tout appel de fonction ou d'effet secondaire dans une taille de la taille d'un VMT (type variable modifié), de même que le type d'une VLA, provoque l'effet secondaire s'il est important de déterminer la valeur: int gimme (void) {format ("C: /"); retour 2; } int Principal (vide) {Tailleof (Int [Gimme ()]); } . Cela formatera réellement :) Inversement, si le format suivant est indéterminé: Tailleof ((int (*) [Format ()]) 0) : Modification de la valeur du format () < / Code> ne changera pas le résultat de Tiplôme (pour Implications dans lequel tous les pointeurs d'objets ont la même taille).



1
votes

in c ++ Tailleof () Code> Calcule la taille du type de expression em> à l'intérieur et remplace l'ensemble " Tailleof () code> appel de la fonction" Avec une constante lors de la compilation.

L'expression dans Tailleof () code> n'est jamais évalué lors de l'exécution du programme. Et ce n'est peut-être même pas un nom de type. Vérifiez ces exemples: P>

struct X { int i; double j;};
int call_to_undefined_function();

sizeof(10/0);
sizeof( ((struct X*)NULL)->j );
sizeof( call_to_undefined_function() + 100 );
sizeof( call_to_undefined_function() + 100.0 );
sizeof( double() / int() );


0 commentaires

16
votes

Tailleof code> est un opérateur, pas une fonction.

C'est habituellement em> évalué en tant que temps de compilation - l'exception étant lorsqu'elle est utilisée sur des tableaux de longueur variable de style C99. p>

Votre exemple est d'évaluer Tailleof (int) code>, qui est bien sûr connu au moment de la compilation, le code est donc remplacé par une constante et donc le ++ Code> n'existe pas au moment de l'exécution d'être exécuté. P>

int myVal;
cout << sizeof myVal << endl;
cout << sizeof(myVal) << endl;


1 commentaires

Il y a une petite erreur: Tailleof int n'est pas valide c comme des types doivent être entre parenthèses!



0
votes

Vous l'avez dit vous-même: «Tailleof» n'est pas une fonction. C'est un opérateur intégré avec syntaxe spéciale et sémantique (voir les réponses précédentes). Rappelez-vous mieux que ce n'est pas une fonction, vous voudrez peut-être vous débarrasser de l'habitude d'utiliser des accolades superflues et préférez utiliser la "taille" sans habilité "avec des expressions comme dans l'exemple suivant

printf("%d\n", sizeof ++i);


0 commentaires