Был ли другой SomeStruct создан и инициализирован где-то неявно?
Подумайте, как возвращается структура. Если и x
, и y
являются 32-битными, это слишком большой размер, чтобы поместиться в регистр 32-битной архитектуры, и то же самое относится к 64-битным значениям в 64-битной архитектуре (ответ @Denton Gentry упоминает как более простые значения возвращаются), поэтому он должен быть где-то размещен. Для этого было бы расточительно использовать кучу, поэтому она должна быть размещена в стеке. Но он не может быть в фрейме стека вашей getSomeStruct
функции, так как он больше не действителен после возврата из функции.
Компилятор вместо этого заставляет вызывающую функцию сообщать вызываемой функции, куда поместить результат (который, вероятно, находится где-то в стеке вызывающей стороны), передавая вызываемой функции скрытый указатель на выделенное ей пространство. Таким образом, место, где он устанавливается на ноль, находится на вызывающей стороне , а не на вашей getSomeStruct
функции.
Существуют также оптимизации, такие как «оптимизация возврата именованных значений», в которых могут быть исключены дополнительные копии. Итак, если бы вы использовали отсутствующий return
, результат был бы создан непосредственно на месте, выделенном вызывающей стороной, вместо создания временного и его копирования.
Чтобы узнать больше о происходящем, вам нужно взглянуть на функцию вызывающего абонента. Является ли инициализация (нулем) «пустого» * 1018 *, которому вы позже назначаете возвращаемое значение вашей функции getSomeStruct
? Или это делает что-то еще?