Considérant:
sizeof(data); sizeof(array); sizeof(vec); sizeof(myclass);
3 Réponses :
Ce dernier est défini en termes de premier. Compte tenu d'une expression, il renvoie la taille du type de l'expression. Donc, Les deux sont évalués à la compilation; Le seul temps d'exécution Je préfère utiliser des expressions sur des types, car les chances indiquent que le type est redondant de manière redondante. P> Tailleof (VEC) code> traduit par
Tailleof (std :: vecteur
Tailleof code> est en C, pas C ++, avec des tableaux de longueur variable. L'opérande à
Tailleof code> est inévalué, il n'ya donc aucun réel éventuellement que l'expression elle-même pourrait générer du code de toute façon. P>
Je préfère aussi l'expression. Parce qu'ils rendent la main-de-moi aussi facile. Si vous modifiez le type d'une variable, il vous suffit de le modifier à un endroit plutôt que de suivre la manière dont le type est utilisé (c'est-à-dire en taille de taille ()).
@Lokiastari: Yup, il correspond mieux conceptuel aussi: pourquoi déduire le type et la taille qui? Nous voulons la taille de l'expression alors tapez-le!
Les seules différences sont en syntaxe et à la commodité.
Syntaxiquement, vous êtes autorisé à laisser les parenthèses dans un cas, mais pas l'autre: p> En ce qui concerne la commodité, considérons quelque chose comme: p> si, par exemple, vous finissez par changer a code> à partir d'un
flotteur à un double, vous devez également modifier
Tailleof (float) code> sur
Tailleof (double) code> pour correspondre. Si vous utilisez
Tailleof (a) code> tout au long, lorsque vous modifiez
A code> à partir d'un
float code> à un
double code>, tout votre Utilisations de
Tailleof code> changera automatiquement aussi, sans aucune édition. Ce dernier est plus souvent un problème en C ++, tel que lorsque vous appelez MALLOC: P>
float *a = malloc(10 * sizeof(*a));
Il est également prêt à noter que les directives de code de noyau Linux couvrent ceci, suggérant d'utiliser la taille de (* variable) pour déterminer la taille de la structure d'un pointeur à struct. C'est probablement une bonne idée de faire cela, si vous vous retrouvez dans une telle situation (bien que dans C ++, il devrait être rare.)
Chaque fois que vous utilisez Cependant, vous pouvez passer des valeurs et même des expressions comme paramètre. Mais la fonction Tailleof prendra uniquement en compte le type de données du paramètre transduit. P>
Vous pouvez également passer des expressions comme Les deux ensembles de syntaxe que vous fournissez, renvoient le même résultat, mais vous ne pouvez pas dire qu'ils sont équivalents. Mais oui, ce dernier est défini en termes d'ancienne. P> Tailleof (
taille de code> concerne. p>
Tailleof (x = x + 1); code>. Dire
x code> était int. Dans ce cas, ce
taille de code> retournera
4 code> (comme sur ma machine) et la valeur de x restera inchangée. C'est parce que
Tailleof code> est toujours évalué au moment de la compilation. P>
La taille d'un type ne peut pas changer au moment de l'exécution.
Tailleof code> donne toujours sa valeur au moment de la compilation.
Pas vraiment pertinent, car vous demandez à propos de C ++; Mais la seule fois
taille de code> est évalué au moment de l'exécution, autant que je sache, est en C, avec des tableaux de longueur variable. Mais ceux-ci ne sont pas légaux en C ++, bien qu'ils soient autorisés avec GCC comme une extension.
Je sais que le résultat est le même, ma question est la suivante: y a-t-il une différence dans le code de l'assemblée?
Notez également que avec
Tailleof (std :: vecteur); code> Cela ne changera pas, peu importe le nombre des éléments contenus
Code de montage? Comme il est résolu au moment de la compilation, le résultat est une valeur Taille_t, je ne pense pas que cela puisse changer du tout.
Non, il n'y a pas de différence. Par définition, la taille de la variable est la taille de son type. Quand quelqu'un de moins paresseux citations au chapitre et au verset de la spécification, accepte leur réponse
@Vincent vous pouvez vérifier cela vous-même. Écrivez un très petit programme et compilez-le avec le drapeau -s (pour GCC). Cela vous donnera un fichier .s avec la sortie de montage.
Merci ! Je viens de vérifier cela et le code de l'assemblage est le même!