2012-04-26 9 views
6

Mi è capitato di incappare in questo pezzo di codice.chiama sizeof su una chiamata di funzione salta effettivamente chiamando la funzione!}

int x(int a){ 
    std::cout<<a<<std::endl; 
    return a + 1; 
} 

int main() 
{ 
    std::cout<<sizeof(x(20))<<std::endl; 
    return 0; 
} 

mi aspettavo di stampare 20 seguita 4. Ma esso stampa solo 4. Perché succede così? Non è corretto ottimizzare una funzione, che ha un effetto collaterale (stampa su IO/file, ecc.)?

+0

Il codice non chiama la funzione —, non manipola nemmeno un puntatore alla funzione. – wallyk

risposta

11

sizeof è un operatore in fase di compilazione e l'operando non viene mai valutato.

+0

Grazie! Ma come possiamo vedere x() ha un effetto collaterale della stampa sul flusso IO. Non sarebbe sbagliato non chiamare la funzione perché conosciamo il valore di sizeof in fase di compilazione? –

+0

@ChethanRavindranath: non importa ciò che fa la funzione. 'sizeof' è progettato specificamente per evitare tutti gli effetti collaterali che l'espressione potrebbe avere. –

+2

Ancora più importante, lo standard di linguaggio dice espressamente che l'operando di 'sizeof' è _non_ valutato. (Questo è molto importante in alcune tecniche di metaprogrammazione, in cui la funzione "chiamata" non esiste nemmeno.) –

4

sizeof è in realtà un operatore e viene valutato in fase di compilazione.

Il compilatore può valutarlo in quanto è stata riparata la dimensione del tipo di ritorno di x; non può cambiare durante l'esecuzione del programma.

2

risultato di sizeof è calcolato in tempo di compilazione in C++. quindi c'è una chiamata di funzione a x (20)

2

sizeof() indica la dimensione del tipo di dati. Nel tuo caso non ha bisogno di chiamare la funzione per ottenere il tipo di dati.

Ho il sospetto che sizeof fa anche si tratti di affari al momento della compilazione, piuttosto che di runtime ...

2

me Let citazione C++ 03 di serie, # 5.3.3.

L'operatore sizeof restituisce il numero di byte nella rappresentazione dell'oggetto dell'operando. L'operando è un'espressione, che non viene valutata o un tipo-id tra parentesi.

Problemi correlati