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)
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)
Pourquoi faut-il que ce soit au moment de la compilation ? La durée d'exécution aurait été meilleure, non ?
@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.
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.
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.
#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 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.
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 ?
4 votes
@dmckee : Je suis loin d'être expérimenté avec les VLAs C99... J'ai juste pensé que cette partie devait être mentionnée, même si la question concerne spécifiquement le C++. Ce que dit la norme C99 est : "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".
0 votes
Votre question est maintenant ambiguë : dans le titre, vous demandez si elle est évaluée au moment de l'exécution ou de la compilation. Mais ensuite, dans le corps de la question, vous demandez si cela dépend de la machine de compilation ou de la machine d'exécution. J'avais l'habitude de compiler mes programmes Windows sous ma machine linux. Sizeof était évalué au moment de la compilation, mais sizeof dépendait du système Windows sur lequel le programme était exécuté. Ce sont deux questions très différentes.
0 votes
Duplicata possible de Comment fonctionne sizeof(array) au moment de l'exécution ?