Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат из функции: по ссылке, по указателю, Не понимаю механику 
V
    Опции темы
xvr
Дата 18.12.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mes @ 18.12.2009,  10:25)
Добавлено @ 10:27
 smile 
Цитата(xvr @  18.12.2009,  09:04 Найти цитируемый пост)
32 буквы 

32 ?!  smile

Пардон, 33.  smile   Но смысла это не меняет  smile 
PM MAIL   Вверх
Gunslinger
Дата 18.12.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



mes, спасибо за такой развернутый ответ.
По порядку:
Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
1. Автоматические переменные после выхода из блока уничтожаются
А когда уничтожаются временные объекты ?

Пробел - не задумывался. Может быть временный объект располагается в стеке, как и переменная\объект (только если они не созданы через new). И, соответственно, уничтожаются после выхода из функции (если важна последовательность уничтожения или что-то еще - то тут тоже пробелsmile).

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
2. Ссылка - всего лишь псевдоним
который имеет некоторые (неочевидные) особенности/правила связанные с его использованием

? Ссылок не существует, по ссылке нельзя перемещаться, как по указателю, ссылка - адрес физически существуемой переменной\объекта,... Что еще?

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
Цитата(Gunslinger @  17.12.2009,  18:24 Найти цитируемый пост)
из блока функции
блок функции  и функциональный блок - несколько разные понятия

блок функции - от { до }, функциональный блок - вы говорите о логическом понятии? конкретный целостный механизм, выполняющий задачу?

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
Цитата(Gunslinger @  17.12.2009,  18:24 Найти цитируемый пост)
3. Указатель - адрес.
Нет. У адреса можно разве взять его адрес ?

Я имел ввиду Тип* р, переменная, в которой хранится адрес.

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
Цитата(Gunslinger @  17.12.2009,  18:24 Найти цитируемый пост)
 Адресуется опять же  на переменную в функции.
да ?!

Тип& возвращает адрес памяти соответствующего размера. Значит return переменная\объект сохраняется и не уничтожается после выхода из функции. xvr привел кусок стандарта.

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
хотя если честно я абсолютно не понял, что в них пытались выразить и как это связано с обсуждаемым вопросом.

цитата выше. Как можно давать адрес на return переменная\объект, если после выхода из функции  перем.\объект уничтожится? xvr привел отрывок из стандарта, что такая перем\объект не будет уничтожена, пока из главной программы на нее существует ссылка.

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
Потому что вместо того чтоб принять абстракции и разбирать их, Вы пытаетесь найти во что превращаются абстрактные инструменты в конечном исполнении, упустив при этом большую часть работы.

С инструментами рисования мне интересна разница и эффекты, которые они дают изображению. Что же касается программирования, то раньше я с++ на дух не переносил: всякие конструкции, тут нужно добавить это ключевое слово, а тут нет, иначе работать будет по  другому; а вот тут еще такой нюанс.. Океан с подводными камнями на каждом шагу. Сейчас, более менее понимая физические основы (работа с памятью), я уже начинаю понимать те подводные камни, от которых у меня сводило мозг раньше.  

PM MAIL   Вверх
xvr
Дата 18.12.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Gunslinger @ 18.12.2009,  17:50)
Тип& возвращает адрес памяти соответствующего размера. Значит return переменная\объект сохраняется и не уничтожается после выхода из функции. xvr привел кусок стандарта.

Цитата(mes @  18.12.2009,  16:03 Найти цитируемый пост)
хотя если честно я абсолютно не понял, что в них пытались выразить и как это связано с обсуждаемым вопросом.

цитата выше. Как можно давать адрес на return переменная\объект, если после выхода из функции  перем.\объект уничтожится?

Опять 'за рыбу деньги'  smile 
Давайте рассмотрим 2 примера:
Код

class SomeObject;

SomeObject func(void)
{
 SomeObject rv;
 ...
 return rv;
}

...

const SomeObject& tmp=func();
Этот пример соотвествует тому, что я приводил и он вполне правильный.

Вариант 2:
Код

class SomeObject;

SomeObject & func(void)
{
 SomeObject rv;
 ...
 return rv;
}

...

const SomeObject& tmp=func();
Этот пример соотвествует тому, о чем ты пишешь, и он на 100% НЕВЕРНЫЙ.



PM MAIL   Вверх
mes
Дата 18.12.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(xvr @  18.12.2009,  17:29 Найти цитируемый пост)
Опять 'за рыбу деньги'  smile

 smile 

Цитата(xvr @  18.12.2009,  17:29 Найти цитируемый пост)
Давайте рассмотрим 2 примера:

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

const int& = 1;







--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 18.12.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(xvr @  18.12.2009,  18:29 Найти цитируемый пост)
class SomeObject;
SomeObject func(void)
{
 SomeObject rv;
 ...
 return rv;
}
...
const SomeObject& tmp=func();

Б@%ь! Это же инициализация ссылки! Только где в таком случае хранится результат? 

Цитата(xvr @  18.12.2009,  18:29 Найти цитируемый пост)

class SomeObject;
SomeObject & func(void)
{
 SomeObject rv;
 ...
 return rv;
}
...
const SomeObject& tmp=func();
Этот пример соотвествует тому, о чем ты пишешь, и он на 100% НЕВЕРНЫЙ.

Об этом вчера кажется у Страуструпа читал. Пишет, результат неопределен и так писать нельзя.

Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 19:23
PM MAIL   Вверх
mes
Дата 18.12.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.12.2009,  18:18 Найти цитируемый пост)
Это же инициализация ссылки!

ага, инициализация ссылки временным объектом - именно эта конструкция и продлевает жизнь объекта до времени жизни ссылки.

Добавлено через 1 минуту и 34 секунды
только ведь ссылки все равно чем ее инициализируют, а вот временному объекту не все равно. 
Поэтому он выступает в главной смысловой роли..
 smile 


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 18.12.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  18.12.2009,  19:22 Найти цитируемый пост)
продлевает жизнь объекта до времени жизни ссылки. 

В стеке? У объектов же в куче времени жизни нет - отсюда и утечки..
PM MAIL   Вверх
mes
Дата 18.12.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.12.2009,  18:30 Найти цитируемый пост)

В стеке? У объектов же в куче времени жизни нет - отсюда и утечки.. 

какие утечки ? временный объект разумеется стековый..



--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 18.12.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  18.12.2009,  19:22 Найти цитируемый пост)
а вот временному объекту не все равно.

т.е.? имеете ввиду указателем?
PM MAIL   Вверх
mes
Дата 18.12.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  18.12.2009,  19:22 Найти цитируемый пост)
т.е.? имеете ввиду указателем? 

нет .. никаких указателей я не рассматривал и они не относятся к данному вопросу.



--------------------
PM MAIL WWW   Вверх
xvr
Дата 19.12.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

Это же инициализация ссылки! Только где в таком случае хранится результат? 
Тут придется углубится в потроха сгенерированного кода.
В общем и целом возврат любой структуры (в том числе и класса) по значению, компилятор ОБЫЧНО делает так:
  •  В список параметров функции добавляется скрытый параметр (типа указателя на структуру), указывающий на место (в стеке) для возвращаемого значения.
  •  Вызывающая процедура отводит место в СВОЕМ стеке и передает указатель на него вызываемой процедуре (в этом скрытом параметре)
  •  При возврате вызываемая процедура копирует то, что она хочет вернуть (обычно это локальная структура уже в ЕЕ стеке) по указателю из скрытого параметра.
(У данной последовательности возможны многочисленные варианты - зависит от платформы и компилятора)
При возврате объектов копирование производится через operator =. В процессе генерации кода возможны оптимизации:
  •  Компилятор может расположить возвращаемую из функции структуру СРАЗУ в стеке вызывающей процедуры, т.е. использовать скрытый указатель сразу как адрес для размещения возвращаемой структуры (вместо размещения ее в локалах)
  •  При вызове типа const Obj& j=func() (наш случай) разместить временную копию возвращаемого объекта в стеке вызывающей функции (что делается в любом случае) и использовать j как alias для адреса этого временного объекта. Вызов деструктора этого временного объекта будет отложен до завершении области видимости  j


PM MAIL   Вверх
Gunslinger
Дата 20.12.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



xvr, спасибо за подробности о механике. Последний вопросsmile Зачем const? Если переменную нужно будет изменить в дальнейших вычислениях? Или работа с временными объектами чем-то отличается от работы с переменными?
PM MAIL   Вверх
xvr
Дата 20.12.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Gunslinger @ 20.12.2009,  17:25)
Зачем const?

Стандарт требует
Цитата

Если переменную нужно будет изменить в дальнейших вычислениях?
Нельзя

PM MAIL   Вверх
Gunslinger
Дата 21.12.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



xvr, тогда буду ссылаться на стандарт, если потребуется.
xvrmes, спасибо за помощь.

Это сообщение отредактировал(а) Gunslinger - 21.12.2009, 09:27
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1065 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.