2010-07-03 11 views

risposta

31

Essi non sono necessariamente memorizzati da nessuna parte. Nel caso più semplice, il compilatore compilerà una chiamata di funzione esattamente come se fossero presenti gli argomenti mancanti.

Ad esempio,

void f(int a, int b = 5) { 
    cout << a << b << endl; 
} 

f(1); 
f(1, 5); 

Le due chiamate al f() sono suscettibili compilati esattamente lo stesso codice assembly. È possibile verificare ciò chiedendo al compilatore di produrre un elenco di assembly per il codice oggetto.

mio compilatore genera:

movl $5, 4(%esp) ; f(1) 
    movl $1, (%esp) 
    call __Z1fii 

    movl $5, 4(%esp) ; f(1, 5) 
    movl $1, (%esp) 
    call __Z1fii 

Come si può vedere, il codice generato è identico.

+9

+1: ecco perché gli argomenti predefiniti sono specificati nel file di intestazione anziché nel file di implementazione. –

+0

+1 Non ci ho mai pensato molto, ma la tua risposta ha perfettamente senso! Semplifica anche notevolmente le cose; quando ho iniziato a usare C++, mi sono chiesto come una funzione virtuale possa essere sovrascritta quando ha valori di parametro predefiniti. Pensavo che i valori predefiniti modificassero la firma in qualche modo o generassero più funzioni, ma solo occuparsene nel sito di chiamata (non facendo nulla alla funzione stessa) ha più senso. – stinky472

+2

@stinky: Significa anche che i clienti devono ricompilare se i valori predefiniti cambiano ... – fredoverflow

Problemi correlati