Я прочитал в Computer Systems перспективу программиста, что при программировании в ассемблере в соглашении относительно протокола вызывающего абонента указано, что возвращаемое значение функции должны храниться в регистре eax
(или аналоговом rax
, в 64-битном компьютере).
Я предполагаю, что это то, что автоматически происходит "за кулисами" при программировании на C, то есть компилятор C "знает", чтобы использовать регистр eax
для возвращаемых значений функций.
Но что происходит в С++, когда возвращаемое значение является большим объектом, который не вписывается в 32-разрядный регистр eax
или 64-бит rax
? Очевидно, вы не можете передать это с помощью стека, так как компилятор обрабатывает операцию возврата по значению большого объекта?
Не обращайте внимания на большой объект, как компилятор C обрабатывает возвращаемую стоимость большой структуры?
Сохраняет ли он его во временном пространстве памяти и возвращает его адрес как возвращаемое значение? Если это так, он должен предсказать, сколько вызовов нужно делать с функцией во время выполнения, а иногда это невозможно, не так ли?