Что происходит в C ++, когда вы возвращаете переменную? - PullRequest
0 голосов
/ 29 мая 2010

Что происходит, шаг за шагом, когда возвращается переменная. Я знаю, что если он встроенный и подходит, он добавляется в rax / eax / ax. Что происходит, когда он не подходит и / или не встроен? Что еще более важно, есть ли гарантированный вызов конструктора копирования?

edit: А как насчет деструктора? Это называется «иногда», «всегда» или «никогда»?

Ответы [ 2 ]

7 голосов
/ 29 мая 2010

Где хранится возвращаемое значение, полностью зависит от соглашения о вызовах и очень сильно зависит от архитектуры и системы.

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

2 голосов
/ 29 мая 2010

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

В архитектурах с богатым регистром (обычно RISC) может быть щедрое распределение регистров для хранения умеренно больших возвращаемых конструкций. Это сделано для того, чтобы избежать чрезмерных транзакций в памяти, которые являются дорогостоящими по сравнению с транзакциями кеша / регистра.

В семействе Intel x86-потомков, о котором говорится в вашем вопросе из упомянутых вами регистров, более вероятно, чем в RISC, вызвать конструктор копирования.

...