que - sintaxis de c++
¿Cómo las funciones de C++ devuelven un objeto grande o una estructura? (3)
Obviamente no puedes pasar esto usando la pila ...
En realidad, la teoría es que cada vez que se llama a una función y se aloja su marco de pila, también deja espacio para el objeto de retorno. Luego, depende de la función de llamada garantizar que el valor de retorno se copie en algún lugar dentro de su propio marco de pila para que pueda mantenerse en él.
Esto corresponde directamente a cómo funciona en C y C ++. Usted tiene una return ...;
declaración, que copia algún valor en el objeto de retorno. El objeto de retorno es un objeto temporal, por lo que el código de llamada debe almacenarlo en algún lugar, con algo como int value = foo();
.
Sin embargo, casi nunca es necesario molestarse en reservar espacio para el valor de retorno. En su lugar, la función que llama deja espacio para ella y la función llamada coloca el valor de retorno directamente allí. Eso es exactamente lo que es la optimización del valor de retorno y lo que representa la elección de copia.
Leí en Computer Systems una perspectiva del programador de que cuando uno está programando en código ensamblador, la convención con respecto al protocolo de la persona que llama establece que el valor devuelto de una función debe almacenarse en el eax
(o el analógico rax
, en el 64 bit). computadora) registro.
Supongo que esto es lo que sucede automáticamente "detrás de la escena" cuando se programa en C, lo que significa que el compilador de C "sabe" usar el registro eax
para las funciones que devuelven valores.
Pero, ¿qué sucede en C ++, cuando el valor devuelto es un objeto grande que no se ajusta al eax
32 bits o al registro de rax
64 bits? Obviamente, no puede pasar esto usando la pila, entonces, ¿cómo maneja el compilador una operación de retorno por valor de un objeto grande?
No importa un objeto grande, ¿cómo maneja el compilador C el retorno por valor de una estructura grande?
¿Lo guarda en un espacio de memoria temporal y devuelve su dirección como valor de retorno? Si es así, tiene que predecir cuántas llamadas se deben hacer a la función durante el tiempo de ejecución, y en ocasiones es imposible, ¿no es así?
Obviamente no puedes pasar esto usando la pila.
¡Usted puede! El truco es que la persona que llama asigne el espacio en la pila y deje que la función lo complete.
Esencialmente, la función devuelve los datos en la parte de la persona que llama del marco de la pila.
Debería imaginar que el valor de retorno de una función va a la pila, como una variable local. Y, al igual que las variables locales, esto se puede optimizar (y existen convenciones que dependen de la arquitectura que dictan un comportamiento bien definido) para que los valores de retorno pequeños se registren en los registros en lugar de en la pila.