¿Se creó e inicializó en alguna parte implícitamente SomeStruct?
Piensa en cómo se devuelve la estructura. Si ambos x
y y
son 32 bits, es demasiado grande para caber en un registro en una arquitectura de 32 bits, y lo mismo se aplica a los valores de 64 bits en una arquitectura de 64 bits (@Denton Gentry explica cómo son los valores más simples devuelto), por lo que debe asignarse en algún lugar. Sería un desperdicio utilizar el montón para esto, por lo que debe asignarse en la pila. Pero no puede estar en el marco de la pila de su función getSomeStruct
, ya que eso ya no es válido después de que la función regrese.
En su lugar, el compilador indica a la función llamada dónde colocar el resultado (que probablemente esté en algún lugar de la pila de la persona que llama), pasando la función llamada un puntero oculto al espacio asignado. Por lo tanto, el lugar donde se establece en cero está en la llamada , no en su función getSomeStruct
.
También hay optimizaciones como la "optimización del valor nominal de devolución" donde se pueden eliminar copias adicionales.Por lo tanto, si hubiera utilizado el return
que falta, el resultado se creará directamente en el espacio asignado por la persona que llama, en lugar de crear un archivo temporal y copiarlo.
Para saber más sobre lo que está sucediendo, debe mirar la función de llamante. ¿Está inicializando (a cero) un SomeStruct
"vacío" al que luego asigna el valor de retorno de su función getSomeStruct
? ¿O está haciendo otra cosa?
Parece que no lo permitió porque tiene el compilador configurado para que las advertencias se traten como errores. ¿Crees que este podría ser el caso de que yo tenga un nivel de advertencia demasiado bajo en algún lugar? –