78 votes

En C++, sizeof est-il évalué au moment de la compilation ou de l'exécution ?

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

sizeof(short int)

26 votes

Pour que ce soit clair, il s'agit d'un opérateur, pas d'une fonction.

3 votes

Il convient de noter que si l'on considère le C99, il existe des situations où le sizeof est évalué au moment de l'exécution, en particulier lorsqu'il est appliqué à des VLA (tableaux de longueur variable).

0 votes

@Michael : Je suppose que la partie type est évaluée au moment de la compilation, mais que la multiplication pour la longueur est effectuée au moment de l'exécution, non ?

84voto

Billy ONeal Points 50631

sizeof est un opérateur de temps de compilation.

1 votes

Pourquoi faut-il que ce soit au moment de la compilation ? La durée d'exécution aurait été meilleure, non ?

2 votes

Voir la réponse de l'utilisateur325525 ici. Il a un exemple de runtime sizeof !

5 votes

@osgx : Ce sont les tableaux à longueur variable de C99. Les VLA ne sont pas en C++.

17voto

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

0 votes

Si compilé sur 32-bit, et exécuter binaire sur 64-bit. C'est 2 octets ou 4 octets ?

0 votes

@ogzylz, par exemple sizeof (void*) sera de 8 si vous compilez pour une plate-forme 64 bits (en supposant des caractères 8 bits), quelle que soit la machine sur laquelle vous construisez le programme. La taille de short int est peu susceptible de changer.

1 votes

Si l'exe 32 bits est exécuté sur un OS 64 bits, la taille des objets ne change pas, pour autant que je sache. J'avais l'impression que le code 32 bits était exécuté dans un sous-système.

12voto

Todor K. Points 56

Depuis C99, sizeof est évalué à l'exécution si et seulement si l'opérande est un tableau de longueur variable, par exemple int a[b], où b n'est pas connu à la compilation. Dans ce cas, sizeof(a) est évalué à l'exécution et son résultat est la taille (en octets) du tableau entier, 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 nombre 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. constante entière.

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

7voto

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

2voto

jitendra_theta Points 45
#include<stdio.h>
void f(int n)
{
    char pp[n];
    printf("%d\n",sizeof(pp));
}
int main()
{
    int n;
    scanf("%d",&n);
    f(n);   
}

Dans ce programme, la taille du tableau est définie à l'exécution, et l'opérateur sizeof imprime la taille correcte après l'initialisation à l'exécution dans gcc 4.4. Quelqu'un peut-il m'expliquer ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X