Est-ce qu'un autre SomeStruct a été créé et initialisé quelque part implicitement?
Pensez à la manière dont la structure est renvoyée. Si les deux x
et y
sont 32 bits, il est trop grand pour tenir dans un registre sur une architecture 32 bits, et la même chose s'applique aux valeurs 64 bits sur une architecture 64 bits (la réponse de @Denton Gentry mentionne comment les valeurs sont plus simples retourné), il doit donc être attribué quelque part. Il serait inutile d'utiliser le tas pour cela, donc il doit être alloué sur la pile. Mais il ne peut pas être sur le cadre de la pile de votre fonction getSomeStruct
, car cela n'est plus valide après le retour de la fonction.
Le compilateur a plutôt l'appelant dit à la fonction appelée où placer le résultat (qui est probablement quelque part sur la pile de l'appelant), en passant la fonction appelée un pointeur caché à l'espace qui lui est alloué. Ainsi, l'endroit où il est mis à zéro est sur l'appelant, pas sur votre getSomeStruct
fonction.
Il existe également des optimisations telles que «l'optimisation du retour de la valeur nommée», dans laquelle des copies supplémentaires peuvent être éli- minées.Donc, si vous aviez utilisé le return
manquant, le résultat serait créé directement sur l'espace alloué par l'appelant, au lieu de créer un temporaire et de le copier.
Pour en savoir plus sur ce qui se passe, vous devez regarder la fonction de l'appelant. Initialise-t-il (à zéro) un SomeStruct
"vide" auquel vous affectez plus tard la valeur de retour de votre fonction getSomeStruct
? Ou fait-il quelque chose d'autre?
Il semblerait que cela ne l'ait pas permis car votre compilateur a été configuré pour que les avertissements soient traités comme des erreurs. Pensez-vous que cela pourrait être le cas d'avoir un niveau d'avertissement trop bas quelque part? –