7
votes

tailleof (valeur) vs taille de (type)?

Considérant:

sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);


8 commentaires

La taille d'un type ne peut pas changer au moment de l'exécution. Tailleof donne toujours sa valeur au moment de la compilation.


Pas vraiment pertinent, car vous demandez à propos de C ++; Mais la seule fois taille de 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 ); 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!


3 Réponses :


2
votes

Ce dernier est défini en termes de premier. Compte tenu d'une expression, il renvoie la taille du type de l'expression. Donc, Tailleof (VEC) traduit par Tailleof (std :: vecteur ) .

Les deux sont évalués à la compilation; Le seul temps d'exécution Tailleof est en C, pas C ++, avec des tableaux de longueur variable. L'opérande à Tailleof 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.

Je préfère utiliser des expressions sur des types, car les chances indiquent que le type est redondant de manière redondante.


2 commentaires

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!



23
votes

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> xxx pré>

En ce qui concerne la commodité, considérons quelque chose comme: p> xxx pré>

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));


1 commentaires

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.)



2
votes

Chaque fois que vous utilisez Tailleof (>) , il est toujours évalué au moment de la compilation. C'est le type de données du paramètre que taille de concerne.

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.

Vous pouvez également passer des expressions comme Tailleof (x = x + 1); . Dire x était int. Dans ce cas, ce taille de retournera 4 (comme sur ma machine) et la valeur de x restera inchangée. C'est parce que Tailleof est toujours évalué au moment de la compilation.

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.


0 commentaires