別の SomeStruct が作成され、どこかで暗黙的に初期化されましたか?
構造体がどのように返されるかを考えてください。x
との両方y
が 32 ビットの場合、大きすぎて 32 ビット アーキテクチャのレジスタに収まらず、64 ビット アーキテクチャの 64 ビット値にも同じことが当てはまります (@Denton Gentry の回答では、より単純な値が返される方法について言及しています)。 、したがって、どこかに割り当てる必要があります。これにヒープを使うのはもったいないので、スタックに割り当てる必要があります。getSomeStruct
ただし、関数が返された後は無効になるため、関数のスタック フレームには配置できません。
代わりに、コンパイラは呼び出し元に、呼び出された関数に割り当てられたスペースへの隠しポインターを渡すことにより、呼び出し元の関数に結果を配置する場所 (おそらく呼び出し元のスタックのどこかにある) を伝えます。したがって、ゼロに設定されている場所は、関数ではなくcallergetSomeStruct
にあります。
余分なコピーを省略できる「名前付き値の戻り値の最適化」などの最適化もあります。したがって、欠落している を使用したreturn
場合、結果は、一時的なものを作成してコピーするのではなく、呼び出し元によって割り当てられたスペースに直接作成されます。
何が起こっているのかをもっと知るには、呼び出し元の関数を調べる必要があります。SomeStruct
後で関数の戻り値を割り当てる「空」を(ゼロに)初期化していますgetSomeStruct
か?それとも何か他のことをしていますか?