web-dev-qa-db-fra.com

La taille de Cof en C ++ est-elle évaluée au moment de la compilation ou de l'exécution?

Par exemple, le résultat de cet extrait de code dépend de la machine: la machine du compilateur ou le fichier exécutable de la machine fonctionne?

sizeof(short int)
59
ogzylz

sizeof est un opérateur de compilation.

59
Billy ONeal

Cela dépend de la machine exécutant votre programme. Mais la valeur est évaluée au moment de la compilation. Ainsi, le compilateur (bien sûr) doit savoir pour quelle machine il compile.

12

sizeof est évalué au moment de la compilation, mais si l'exécutable est déplacé vers une machine où les valeurs de temps de compilation et d'exécution seraient différentes, l'exécutable ne sera pas valide.

6
anon

Depuis C99, sizeof est évalué au moment de l'exécution si et seulement si l'opérande est un tableau de longueur variable, par ex. int a [b], où b n'est pas connu au moment de la compilation. Dans ce cas, sizeof (a) est évalué au moment de l'exécution et son résultat est la taille (en octets) de l'ensemble du tableau, c'est-à-dire la taille de tous les éléments du tableau, combinés. Pour obtenir le nombre d'éléments dans le tableau, utilisez sizeof(a) / sizeof(b). De la norme C99:

L'opérateur sizeof donne la taille (en octets) de son opérande, qui peut être une expression ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. Si le type de l'opérande est un type de tableau de longueur variable, l'opérande est évalué; sinon, l'opérande n'est pas évalué et le résultat est une constante entière.

Notez que tout cela est différent de ce que vous obtiendriez si vous allouiez un tableau sur le tas, par exemple int* a = new int[b]. Dans ce cas, sizeof (a) vous donnerait simplement la taille d'un pointeur vers int, c'est-à-dire 4 ou 8 octets, quel que soit le nombre d'éléments dans le tableau.

5
Todor K.