NO. int
возвращается в регистр , и вызываемый абонент не участвует в том, что делает вызывающий с этим регистром после его возврата. Он никогда не может быть сохранен в памяти.
Если тип возвращаемого значения не был int
, а вместо этого достаточно большой, чтобы соглашение о вызовах возвращало его по значению, то hypothetical_func
будет иметь адрес длявыход. (Или гипотетическое (ужасное) соглашение о вызовах может вернуть даже int
через скрытый указатель вместо регистра. Предполагается, что машина является машиной регистра, как и все реальные процессоры.)
Но это может быть простовозвращаемое значение временное, а не фактическое LHS присваивания. (Или инициализация, которая достаточно близка к тому же в C, если не в C ++). Особенно, если назначение глобальное или что-то. См. Что мешает использовать аргумент функции в качестве скрытого указателя? для случая *out = foo();
, где T *out
- это аргумент функции. Очень нетривиально доказать, если / когда безопасно передавать эту функцию arg в качестве объекта возвращаемого значения для foo()
.
А некоторые компиляторы даже не пытаются оптимизировать, а просто освобождают местов стеке для временного возвращаемого значения и скопируйте его в конечный объект.
И, как указывает @prl, возвращаемое значение может даже не быть инициализатором для переменной,Например, printf("%d\n", foo());
просто передает возвращаемое значение в функцию arg. или foo();
отбрасывает возвращаемое значение, нигде не присваивая его. (Но если соглашение о вызовах указывает, что функция возвращает по скрытому указателю, вызывающая сторона должна передать указатель на достаточное времяВызываемый объект все еще собирается записать свое возвращаемое значение, и ему не нужно переставлять ошибки из неверного указателя или перезаписывать что-то еще. Это деталь соглашения об ассемблере / вызове, отдельная от работы абстрактной машины C. Или, я думаю, вы могли бы сказать,объект возвращаемого значения все еще существует, он просто нигде не назначен.)
Плюс с встроенной сборкой, у вас даже нет доступа к этой ,Если вы не рассчитываете написать функцию __attribute__((naked))
, в которой вы все равно пишете всю функцию внутри оператора asm, и компилятор не обрабатывает ничего, кроме искажения имени в имени функции. Нет пролога, эпилога или абстрагирования соглашения о вызовах с переменными C для аргументов и тем, который вы return
. (/ ворчит, что компиляторы C не могут создавать функции, которые возвращают несколько отдельных значений в нескольких регистрах, как вы можете в рукописном asm.)
Но даже с рукописным asm нет способа сделать это дляобычные соглашения о вызовах на обычных ISA, таких как x86 и ARM. Объект возвращаемого значения для int
- это просто регистр.