La dimensione in C ++ viene valutata al momento della compilazione o del tempo di esecuzione?

Ad esempio, il risultato di questo snippet di codice dipende da quale macchina: la macchina del compilatore o il file eseguibile della macchina funziona?

sizeof(short int) 

sizeof è un operatore di compilazione del tempo.

Dipende dalla macchina che esegue il tuo programma. Ma il valore valuta al momento della compilazione. Quindi il compilatore (ovviamente) deve sapere per quale macchina si sta compilando.

sizeof viene valutato in fase di compilazione, ma se l’eseguibile viene spostato su una macchina in cui i valori di tempo e runtime di compilazione sarebbero diversi, l’eseguibile non sarà valido.

A partire da C99, sizeof viene valutato in fase di esecuzione se e solo se l’operando è una matrice di lunghezza variabile, ad esempio int a [b], dove b non è noto in fase di compilazione. In questo caso, sizeof (a) viene valutato in fase di esecuzione e il suo risultato è la dimensione (in byte) dell’intero array, ovvero la dimensione di tutti gli elementi dell’array, combinati. Per ottenere il numero di elementi nella matrice, utilizzare sizeof(a) / sizeof(b) . Dallo standard C99:

L’operatore sizeof produce la dimensione (in byte) del suo operando, che può essere un’espressione o il nome tra parentesi di un tipo. La dimensione è determinata dal tipo di operando. Il risultato è un numero intero. Se il tipo dell’operando è un tipo di array di lunghezza variabile, viene valutato l’operando; altrimenti, l’operando non viene valutato e il risultato è una costante intera.

Si noti che tutto ciò è diverso da ciò che si otterrebbe se si assegnasse un array all’heap, ad esempio int* a = new int[b] . In tal caso, sizeof (a) ti darebbe la dimensione di un puntatore a int, cioè 4 o 8 byte, indipendentemente dal numero di elementi presenti nell’array.