![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
1. Ссылка и указатель на функцию значат, что функция создала переменную с результатом и на эту переменную возвратила адрес. Но локальные переменные после завершения работы функции удаляются. Или ссылки и указатели дают, если возвращающее значение создается в куче? 2. Не понятны выделенные строки - копировать не стал, чтобы пост не увеличивать. |
||||
|
|||||
xvr |
|
||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если в целом, то такое действо:
|
||||||||||||||||
|
|||||||||||||||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Получается, даже стековый объект не уничтожается и поэтому на него можно возвращать ссылки и указатели?
С переводом туго, пытаюсь въехать, как понял. ref - ссылка на результат функции и она объявлена константой, т.е. менять ее значение нельзя. Это как-то связано с тем, что значение на самом деле находится в функции? Например, компилятор запрещает писать в такие участки памяти? Это сообщение отредактировал(а) Gunslinger - 17.12.2009, 10:09 |
||||
|
|||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нет. Это случай, когда возвращается САМ объект (by value), а не ссылка или указатель на него. В таком случае происходит копирование возвращаемого объекта из стека вызванной функции в стек вызывающей (при выполнении оператора return в вызванной функции)
![]() Основной цимус тут в том, что такая конструкция позволяет избежать копирования объекта (за счет усложнения компилятора ![]() |
||||||||
|
|||||||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
и У меня не вяжется. Сейчас моя логика такая: 1. Автоматические переменные после выхода из блока уничтожаются 2. Ссылка - всего лишь псевдоним и вместо нее компилятор подставляет автоматическую переменную из блока функции 3. Указатель - адрес. Адресуется опять же на переменную в функции. Отсюда выводы такие: 1. Возврат по значению: либо объект, либо выражение (temporary T3 из примера стандарта) копируется в переменную во внешней программе, которой присвоен 2. Возврат по ссылке\указателю: работа с переменной\temporary T3 функции Это сообщение отредактировал(а) Gunslinger - 17.12.2009, 19:29 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это так, но совершенно непонятно, какое это имеет отношение к рассматриваемому примеру - там нет возврата ПО ССЫЛКЕ или УКАЗАТЕЛЯ.
|
||||
|
|||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Весь компилятор 'чисто логическая штука' Процессор ничего не знает о том, что такое 'объект', 'класс', 'exception' и т.д.
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Имхо, В cpp (как в любом ЯВУ) практически все конструкции надо понимать как "логическую штуку", за исключением когда специально расматривается конструкция в условиях реализации конкретного компилятора. увы не всего лишь. Это утверждение справедливо лишь ссылки на полноценный объект. Есть еще правило, приведенное цитатой xvr и на которое Вы не обратили должного внимания :
![]() Добавлено через 1 минуту и 56 секунд ![]() 32 ?! ![]() Это сообщение отредактировал(а) mes - 18.12.2009, 10:26 |
|||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Там по временные переменные, ссылки и время жизни - а все вместе скомпоновать в осмысленное предложение я не смог. Вот и не понял смысл 3й альтернативы. Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 13:15 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В общем там говорится , что если временный объект "пристыковать" к ссылке, то он сохраняется (удлиняет жизнь) на все время жизни ссылки. ![]() Это сообщение отредактировал(а) mes - 18.12.2009, 13:28 |
|||
|
||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Спасибо, но чем тогда эта инфа из стандарта отличается от тоо, что я писал выше:
Судя по ответу xvr, мой ответ не подходил для данного случая. Мне интересно, как правильно - чтобы знать нюансы работы с получаемыми подобным образом (*, &) результатами. Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 14:13 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
А когда уничтожаются временные объекты ? который имеет некоторые (неочевидные) особенности/правила связанные с его использованием блок функции и функциональный блок - несколько разные понятия Нет. У адреса можно разве взять его адрес ? да ?! Сомневаюсь что из приведенного можно сделать правильные выводы, хотя если честно я абсолютно не понял, что в них пытались выразить и как это связано с обсуждаемым вопросом. оба Ваших вывода ![]() Ну это я могу объяснить.. Потому что вместо того чтоб принять абстракции и разбирать их, Вы пытаетесь найти во что превращаются абстрактные инструменты в конечном исполнении, упустив при этом большую часть работы. То есть вместо разбора того, как рисовать худ. инструментами, и какими особенностями обладает каждая из них, например чем кисточка отличается от каранда и от губки, Вы приводите все к одному выводу, они оставляют след краской. Может для ксерокопии картины и достаточно изучить каким цветом выражен каждый пиксель, но для художества, надо понимать, как можно получить нужный эффект, не заботясь о каждом пикселе. Это сообщение отредактировал(а) mes - 18.12.2009, 16:03 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
Gunslinger |
|
||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
mes, спасибо за такой развернутый ответ.
По порядку:
Пробел - не задумывался. Может быть временный объект располагается в стеке, как и переменная\объект (только если они не созданы через new). И, соответственно, уничтожаются после выхода из функции (если важна последовательность уничтожения или что-то еще - то тут тоже пробел ![]()
? Ссылок не существует, по ссылке нельзя перемещаться, как по указателю, ссылка - адрес физически существуемой переменной\объекта,... Что еще?
блок функции - от { до }, функциональный блок - вы говорите о логическом понятии? конкретный целостный механизм, выполняющий задачу?
Я имел ввиду Тип* р, переменная, в которой хранится адрес.
Тип& возвращает адрес памяти соответствующего размера. Значит return переменная\объект сохраняется и не уничтожается после выхода из функции. xvr привел кусок стандарта.
цитата выше. Как можно давать адрес на return переменная\объект, если после выхода из функции перем.\объект уничтожится? xvr привел отрывок из стандарта, что такая перем\объект не будет уничтожена, пока из главной программы на нее существует ссылка.
С инструментами рисования мне интересна разница и эффекты, которые они дают изображению. Что же касается программирования, то раньше я с++ на дух не переносил: всякие конструкции, тут нужно добавить это ключевое слово, а тут нет, иначе работать будет по другому; а вот тут еще такой нюанс.. Океан с подводными камнями на каждом шагу. Сейчас, более менее понимая физические основы (работа с памятью), я уже начинаю понимать те подводные камни, от которых у меня сводило мозг раньше. |
||||||||||||||
|
|||||||||||||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Опять 'за рыбу деньги' ![]() Давайте рассмотрим 2 примера:
Вариант 2:
|
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() хотелось бы добавить что к рассматриваемому вопросу функция прямого отношения не имеет.. вот тут тот же самый эффект :
|
|||
|
||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Б@%ь! Это же инициализация ссылки! Только где в таком случае хранится результат?
Об этом вчера кажется у Страуструпа читал. Пишет, результат неопределен и так писать нельзя. Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 19:23 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ага, инициализация ссылки временным объектом - именно эта конструкция и продлевает жизнь объекта до времени жизни ссылки. Добавлено через 1 минуту и 34 секунды только ведь ссылки все равно чем ее инициализируют, а вот временному объекту не все равно. Поэтому он выступает в главной смысловой роли.. ![]() |
|||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет .. никаких указателей я не рассматривал и они не относятся к данному вопросу. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В общем и целом возврат любой структуры (в том числе и класса) по значению, компилятор ОБЫЧНО делает так:
При возврате объектов копирование производится через operator =. В процессе генерации кода возможны оптимизации:
|
|||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
xvr, спасибо за подробности о механике. Последний вопрос
![]() |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Стандарт требует
|
||||
|
|||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
xvr, тогда буду ссылаться на стандарт, если потребуется.
xvr, mes, спасибо за помощь. Это сообщение отредактировал(а) Gunslinger - 21.12.2009, 09:27 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |