2012-04-26 9 views
6

Me tropecé con esta pieza de código.llamando a sizeof en una llamada de función salta realmente llamar a la función!}

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

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

Esperaba que imprimiera 20 seguido de 4. Pero simplemente imprime 4. ¿Por qué sucede esto? ¿No es incorrecto optimizar una función que tiene un efecto secundario (imprimir en IO/archivo, etc.)?

+0

El código no llama a la función — ni siquiera manipula un puntero a la función. – wallyk

Respuesta

11

es un operador en tiempo de compilación, y el operando nunca se evalúa.

+0

¡Gracias! Pero como podemos ver, x() tiene un efecto secundario de imprimir en la secuencia IO. ¿No sería incorrecto no llamar a la función porque solo conocemos el valor de sizeof en tiempo de compilación? –

+0

@ChethanRavindranath: no importa lo que haga la función. 'sizeof' está diseñado específicamente para evitar todos los efectos secundarios que pueda tener la expresión. –

+2

Más importante aún, el estándar de lenguaje dice expresamente que el operando de 'sizeof' no se evalúa. (Esto es muy importante en algunas técnicas de metaprogramación, donde la función "llamada" ni siquiera existe). –

4

es en realidad un operador y se evalúa en tiempo de compilación.

El compilador puede evaluarlo porque el tamaño del tipo de retorno de x es fijo; no puede cambiar durante la ejecución del programa.

2

resultado de sizeof se calcula en tiempo de compilación en C++. por lo tanto, tiene una llamada de función a x (20)

2

sizeof() da el tamaño del tipo de datos. En su caso, no necesita llamar a la función para obtener el tipo de datos.

Sospecho sizeof también hace su negocio en tiempo de compilación en tiempo de ejecución en lugar de ...

2

Let Me cita C++ 03 estándar, # 5.3.3.

El operador sizeof produce el número de bytes en el objeto representación de su operando. El operando es una expresión, que no se evalúa, o un ID de tipo entre paréntesis.

Cuestiones relacionadas