В соответствии с соглашением о вызовах AMD64 при возврате объекта, хранящегося в памяти, выполняются следующие шаги:
- Вызывающая сторона выделяет память для возвращаемого объекта и передает адрес в качестве скрытого параметра в
%rdi
. - Callee заполняет объект.
- Callee возвращает адрес объекта в
%rax
.
Мне интересно, почему было добавлено 3-е требование к стандарту? Память уже выделена вызывающей стороной, поэтому нет необходимости напоминать вызывающей стороне, где она произвела выделение. Какой смысл возвращать адрес памяти в% rax?