À l'origine, cela fait partie d' une autre question.
Pourquoi est-on sizeof
appelé un opérateur de compilation? N'est-ce pas réellement un opérateur d'exécution? Et s'il s'agit bien d'un opérateur au moment de la compilation, comment peut-il aider à produire du code portable qui s'exécute de la même manière sur différents ordinateurs? Veuillez expliquer en détail.
sizeof(polymorphic_ptr*)
qu'être constant est assez contre-intuitif et tout simplement stupide. Oui, c'est la manière C ++, mais idiote quand même.Réponses:
sizeof()
vous donne la taille du type de données , pas la taille d'une instance particulière de ce type en mémoire.Par exemple, si vous disposiez d'un objet de données de chaîne qui allouait un tableau de caractères de taille variable au moment de l'exécution,
sizeof()
ne pouvait pas être utilisé pour déterminer la taille de ce tableau de caractères. Cela ne vous donnerait que la taille du pointeur.La taille d'un type de données est toujours connue au moment de la compilation.
la source
sizeof
sur un tableau, vous allez obtenir la taille du tableau (qui est le temps de la taille de l' élément , le nombre d'éléments). Mais si vous l'utilisez sur un pointeur, vous n'obtenez que la taille du pointeur. Donc, puisque dans la plupart des cas où vous souhaitez connaître la taille d'un tableau, vous n'avez qu'un pointeur, ce n'est pas du tout utile.parce que la taille entière de "l'appel" est calculée au moment de la compilation et tout ce qui se trouve entre les parenthèses est ignoré et non exécuté au moment de l'exécution,
le résultat est purement basé sur les informations de type statique disponibles pour le compilateur
la source
Parce qu'au moment de la compilation, le compilateur calcule la taille de l'expression et remplace cette valeur constante au moment de la compilation.
Non. Vous pouvez même utiliser
sizeof
pour évaluer la taille des expressions que vous ne pouvez pas exécuter légalement (c'est-à-dire qui entraîneraient un comportement indéfini), tant que le compilateur peut déterminer quel est le type de l'expression.De plus, même avant C ++ 11
constexpr
, vous pouvez utiliser dessizeof
expressions de manière que vous ne pouvez pas utiliser d'expressions d'exécution.Les types peuvent varier en taille sur différentes plateformes. L'utilisation d'
sizeof
expressions au lieu d'hypothèses codées en dur signifie que votre code ne se cassera pas lorsque vous compilerez sur une plateforme différente et que vos types changeront de taille.la source
C ++ ne stocke pas réellement les métadonnées des objets au moment de l'exécution, donc la vérification de la taille doit être au moment de la compilation. Pour un exemple de la façon dont C ++ ne valide pas la taille, déclarez un tableau
int
d'une taille arbitraire et lisez après la fin de celui-ci. Si vous êtes chanceux, vous obtiendrez un,segfault
mais plus probablement, vous lirez simplement du charabia, car C ++ ne suit pas la taille de votre tableau.Voir Un programme C / C ++ peut-il provoquer une erreur de segmentation après avoir lu après la fin d'un tableau (UNIX)? pour un exemple de SO.
la source