2010-07-03 13 views

Respuesta

31

no son necesariamente almacenados en cualquier lugar. En el caso más simple, el compilador compilará una llamada de función exactamente igual que si los argumentos faltantes estuvieran presentes.

Por ejemplo,

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

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

Las dos llamadas a f() son propensos a compilado exactamente el mismo código ensamblador. Puede comprobar esto pidiéndole a su compilador que produzca una lista de ensamblaje para el código del objeto.

Mi compilador genera:

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

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

Como se puede ver, el código generado es idéntico.

+9

+1 - por lo que los argumentos predeterminados se especifican en el archivo de encabezado en lugar de en el archivo de implementación. –

+0

+1 Nunca pensé mucho sobre esto, ¡pero tu respuesta tiene mucho sentido! También simplifica las cosas considerablemente; cuando comencé a usar C++, me preguntaba cómo una función virtual podría ser anulada cuando tenga valores de parámetros predeterminados. Estaba pensando que los valores predeterminados modificaban la firma de alguna manera o generaban más funciones, pero solo lidiar con ella en el sitio de llamadas (no hacer nada con la función en sí) tiene más sentido. – stinky472

+2

@stinky: También significa que los clientes tienen que volver a compilar si cambian los valores predeterminados ... – fredoverflow

Cuestiones relacionadas