2014-11-18 3 views
2

Встраиваемые типы, такие как int, char и т. Д., Могут быть возвращены из функции с использованием регистров, но что, если функция возвращает некоторый большой объект. Я предлагаю, чтобы стек процесса не мог использоваться для такой проблемы, верно? Может ли кто-нибудь объяснить, как объект передается вызываемому?C++ как объект-значение возвращается из функции в деталях

SomeObj function() { 
    SomeObj someObj; 
    return someObj; 
} 
+0

Почему бы стек не работать ?! Пределы стека зависят от ОС, и большинство больших объектов создают теоретические данные о куче и объекте, который он сам на стеке. –

+0

@Doggynub вы могли бы указать конкретный момент в функции вызова/выхода, когда возвращаемое значение будет нажато на стек, пожалуйста? – vard

+0

Вы должны указать, о какой архитектуре вы спрашиваете. Также прочитайте соответствующую документацию. – Jester

ответ

3

Обычно в большинстве компиляторов для этой цели используется стек. Даже для больших объектов это все еще так. Вызывающая функция ожидает найти вызванное значение функции в стеке, когда вызываемая функция вернется.

Одним из решений является резервирование области стека до вызова функции. Вызываемая функция может получить доступ к этой области, чтобы заполнить ее результатом (доступ к стеку не ограничивается вершиной в конце).

+0

Не обращается ли адрес обратного звонка глубже любого значения, которое вы можете положить в стек в вызываемой функции? Вызывается ли функция pop callee возвращать адрес из стека, а затем ставить объект, который он хочет вернуть, а затем выполнить переход к выскоренному адресу? – vard

+0

Это обрабатывается компиляторами, чтобы иметь указатель в вызываемом стеке, ссылающийся на какое-то место в стеке calLee, где возвращенные данные перемещаются их –

+0

. Одним из решений является резервирование области стека до вызова функции. Вызываемая функция может получить доступ к этой области, чтобы заполнить ее результатом (доступ к стеку не ограничивается вершиной в конце). –