| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Возврат из функции: по ссылке, по указателю |
| Автор: xvr 16.12.2009, 12:52 | ||||||||||||||||
Если в целом, то такое действо:
|
| Автор: Gunslinger 17.12.2009, 10:05 | ||||
Получается, даже стековый объект не уничтожается и поэтому на него можно возвращать ссылки и указатели?
С переводом туго, пытаюсь въехать, как понял. ref - ссылка на результат функции и она объявлена константой, т.е. менять ее значение нельзя. Это как-то связано с тем, что значение на самом деле находится в функции? Например, компилятор запрещает писать в такие участки памяти? |
| Автор: xvr 17.12.2009, 11:33 | ||||||||
Нет. Это случай, когда возвращается САМ объект (by value), а не ссылка или указатель на него. В таком случае происходит копирование возвращаемого объекта из стека вызванной функции в стек вызывающей (при выполнении оператора return в вызванной функции)
Основной цимус тут в том, что такая конструкция позволяет избежать копирования объекта (за счет усложнения компилятора |
| Автор: Gunslinger 17.12.2009, 19:24 | ||
и У меня не вяжется. Сейчас моя логика такая: 1. Автоматические переменные после выхода из блока уничтожаются 2. Ссылка - всего лишь псевдоним и вместо нее компилятор подставляет автоматическую переменную из блока функции 3. Указатель - адрес. Адресуется опять же на переменную в функции. Отсюда выводы такие: 1. Возврат по значению: либо объект, либо выражение (temporary T3 из примера стандарта) копируется в переменную во внешней программе, которой присвоен 2. Возврат по ссылке\указателю: работа с переменной\temporary T3 функции |
| Автор: xvr 17.12.2009, 19:56 | ||||
Это так, но совершенно непонятно, какое это имеет отношение к рассматриваемому примеру - там нет возврата ПО ССЫЛКЕ или УКАЗАТЕЛЯ.
|
| Автор: Gunslinger 18.12.2009, 09:18 |
т.е. это чисто логическая штука? Ума не приложу, что еще можно делать с памятью на физическом уровне, кроме как копировать\обрабатывать содержимое ячейки и обращаться к ней по адресу.. |
| Автор: xvr 18.12.2009, 10:04 | ||||
Весь компилятор 'чисто логическая штука' Процессор ничего не знает о том, что такое 'объект', 'класс', 'exception' и т.д.
|
| Автор: mes 18.12.2009, 10:25 | ||
Имхо, В cpp (как в любом ЯВУ) практически все конструкции надо понимать как "логическую штуку", за исключением когда специально расматривается конструкция в условиях реализации конкретного компилятора. увы не всего лишь. Это утверждение справедливо лишь ссылки на полноценный объект. Есть еще правило, приведенное цитатой xvr и на которое Вы не обратили должного внимания :
Добавлено через 1 минуту и 56 секунд 32 ?! |
| Автор: Gunslinger 18.12.2009, 13:14 | ||
Там по временные переменные, ссылки и время жизни - а все вместе скомпоновать в осмысленное предложение я не смог. Вот и не понял смысл 3й альтернативы. |
| Автор: mes 18.12.2009, 13:27 |
В общем там говорится , что если временный объект "пристыковать" к ссылке, то он сохраняется (удлиняет жизнь) на все время жизни ссылки. |
| Автор: Gunslinger 18.12.2009, 14:09 | ||||
Спасибо, но чем тогда эта инфа из стандарта отличается от тоо, что я писал выше:
Судя по ответу xvr, мой ответ не подходил для данного случая. Мне интересно, как правильно - чтобы знать нюансы работы с получаемыми подобным образом (*, &) результатами. |
| Автор: mes 18.12.2009, 14:58 | ||
1. в примере который мы разбираем нет никакого возврата по ссылке/указателю 2. можно бы продолжать, но пункта 1. более чем достаточно, хотя в Вашей фразе и помимо него много неясностей.. |
| Автор: Gunslinger 18.12.2009, 15:18 |
| что именно - разъясню. Может тогда станет ясно, почему я вас обоих не понимаю. |
| Автор: mes 18.12.2009, 16:03 | ||
А когда уничтожаются временные объекты ? который имеет некоторые (неочевидные) особенности/правила связанные с его использованием блок функции и функциональный блок - несколько разные понятия Нет. У адреса можно разве взять его адрес ? да ?! Сомневаюсь что из приведенного можно сделать правильные выводы, хотя если честно я абсолютно не понял, что в них пытались выразить и как это связано с обсуждаемым вопросом. оба Ваших вывода Ну это я могу объяснить.. Потому что вместо того чтоб принять абстракции и разбирать их, Вы пытаетесь найти во что превращаются абстрактные инструменты в конечном исполнении, упустив при этом большую часть работы. То есть вместо разбора того, как рисовать худ. инструментами, и какими особенностями обладает каждая из них, например чем кисточка отличается от каранда и от губки, Вы приводите все к одному выводу, они оставляют след краской. Может для ксерокопии картины и достаточно изучить каким цветом выражен каждый пиксель, но для художества, надо понимать, как можно получить нужный эффект, не заботясь о каждом пикселе. |
| Автор: xvr 18.12.2009, 17:31 |
Пардон, 33. |
| Автор: Gunslinger 18.12.2009, 17:50 | ||||||||||||||
| mes, спасибо за такой развернутый ответ. По порядку:
Пробел - не задумывался. Может быть временный объект располагается в стеке, как и переменная\объект (только если они не созданы через new). И, соответственно, уничтожаются после выхода из функции (если важна последовательность уничтожения или что-то еще - то тут тоже пробел
? Ссылок не существует, по ссылке нельзя перемещаться, как по указателю, ссылка - адрес физически существуемой переменной\объекта,... Что еще?
блок функции - от { до }, функциональный блок - вы говорите о логическом понятии? конкретный целостный механизм, выполняющий задачу?
Я имел ввиду Тип* р, переменная, в которой хранится адрес.
Тип& возвращает адрес памяти соответствующего размера. Значит return переменная\объект сохраняется и не уничтожается после выхода из функции. xvr привел кусок стандарта.
цитата выше. Как можно давать адрес на return переменная\объект, если после выхода из функции перем.\объект уничтожится? xvr привел отрывок из стандарта, что такая перем\объект не будет уничтожена, пока из главной программы на нее существует ссылка.
С инструментами рисования мне интересна разница и эффекты, которые они дают изображению. Что же касается программирования, то раньше я с++ на дух не переносил: всякие конструкции, тут нужно добавить это ключевое слово, а тут нет, иначе работать будет по другому; а вот тут еще такой нюанс.. Океан с подводными камнями на каждом шагу. Сейчас, более менее понимая физические основы (работа с памятью), я уже начинаю понимать те подводные камни, от которых у меня сводило мозг раньше. |
| Автор: xvr 18.12.2009, 18:29 | ||||||||
Опять 'за рыбу деньги' Давайте рассмотрим 2 примера:
Вариант 2:
|
| Автор: mes 18.12.2009, 19:03 | ||
хотелось бы добавить что к рассматриваемому вопросу функция прямого отношения не имеет.. вот тут тот же самый эффект :
|
| Автор: Gunslinger 18.12.2009, 19:18 | ||||
Б@%ь! Это же инициализация ссылки! Только где в таком случае хранится результат?
Об этом вчера кажется у Страуструпа читал. Пишет, результат неопределен и так писать нельзя. |
| Автор: mes 18.12.2009, 19:22 |
ага, инициализация ссылки временным объектом - именно эта конструкция и продлевает жизнь объекта до времени жизни ссылки. Добавлено через 1 минуту и 34 секунды только ведь ссылки все равно чем ее инициализируют, а вот временному объекту не все равно. Поэтому он выступает в главной смысловой роли.. |
| Автор: Gunslinger 18.12.2009, 19:30 |
В стеке? У объектов же в куче времени жизни нет - отсюда и утечки.. |
| Автор: mes 18.12.2009, 19:45 | ||
какие утечки ? временный объект разумеется стековый.. |
| Автор: Gunslinger 18.12.2009, 20:22 |
т.е.? имеете ввиду указателем? |
| Автор: mes 18.12.2009, 22:33 |
нет .. никаких указателей я не рассматривал и они не относятся к данному вопросу. |
| Автор: xvr 19.12.2009, 12:08 | ||
В общем и целом возврат любой структуры (в том числе и класса) по значению, компилятор ОБЫЧНО делает так:
При возврате объектов копирование производится через operator =. В процессе генерации кода возможны оптимизации:
|
| Автор: Gunslinger 20.12.2009, 17:25 |
| xvr, спасибо за подробности о механике. Последний вопрос |
| Автор: xvr 20.12.2009, 19:57 | ||||
Стандарт требует
|
| Автор: Gunslinger 21.12.2009, 09:25 |
| xvr, тогда буду ссылаться на стандарт, если потребуется. xvr, mes, спасибо за помощь. |