Il semble que la taille de la taille n'est pas une fonction réelle?
Par exemple, si vous écrivez comme ceci: p> Vous pouvez obtenir une sortie comme: p> < pré> xxx pré> et lorsque vous creusez dans le code d'assemblage, vous trouverez STH comme ceci: p> 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? P> p>
9 Réponses :
Tailleof analyse l'expression transmise pour trouver son type. Il retourne ensuite la taille du type. P>
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. P>
+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)); } code>. Dans ce cas, la taille de la matrice n'est pas connue au moment de la compilation mais au moment de l'exécution.
exactement ce que c'est censé faire: met directement la constante "la taille de la variable / constante / type / etc. dans le code p>
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. P>
et votre code ne compilera pas, au lieu de vous donner une sortie ;-) à cause de sizoef code>; -) p>
BTW, cela dépend de la mise en œuvre, mais je doute que la plupart d'entre eux produiront des appels à _printf Code> lorsque vous effectuez
Opérateur <<< / code> pour COUT.
La taille du type retourné est calculée au moment de la compilation, il n'y a pas de surcharge d'exécution p>
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. P>
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 code> 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 forte>. p> BlockQuote>
En réponse au commentaire de Iberread, voici un exemple pour le boîtier de la variable de variable C99: p>
xxx pré> 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 ... p> p>
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 ()]); } code>. Cela formatera réellement :) Inversement, si le format suivant est indéterminé:
Tailleof ((int (*) [Format ()]) 0) Code>: 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).
in c ++ L'expression dans 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.
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() );
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 code> est un opérateur, pas une fonction.
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;
Il y a une petite erreur: Tailleof int code> n'est pas valide c comme des types doivent être entre parenthèses!
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);
Notez que l'expression transmise à la taille de papier n'est pas évaluée, donc je le fait pas i> pré-incrément. On dirait une belle façon d'introduire un bug dans (ou d'obsciser) du code.