![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
после прочтения этой статтьи у меня появился резонный вопрос: WTF? Кто, что думает по поводу подобного?
|
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
В чем заключается вопрос? Подобные конструкции языка не являются ошибочными. Если же вопрос заключается в целесообразности такого использования, так я лучше приведу две цитаты:
"Си остр, как бритва, с помощью него можно создать как красивую статую, так и кровавое месиво" (Керниган) "C - если вы захотите выстрелить себе в ногу, то сделаете без проблем. C++ - вы можете выстрелить себе в ногу, даже если не хотели этого." (автор неизвестен) -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
почему не являются? Где это написано? Я не понимаю на каком основании продлевается время жизни объекта. |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
рассматривая объект класса string, можно совершенно определенно сказать, что время жизни продлевается на том основании, что объект будет существовать до тех пор, пока на него не закончатся ссылки. Ссылки всего 2. После выхода из функции - одна. Так почему же объект должен удаляться?
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
не забываем, что это С++ и garbage collector здесь отсутсвует, а значит понятия "пока на него не закончатся ссылки" в С++ несуществует, если мы не используем smart pointers(но это совершенно другая тема, здесь не об этом) |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
не забываем, что класс string построен именно таким образом, что его объект не уничтожится, пока на него не закончатся внутренние ссылки. Объект класса string не копируется при присваивании, увеличивается внутренний счетчик ссылок. Копирование происходит только при изменении объекта. При удалении счетчик ссылок уменьшается. Garbage collector тут совсем ни при чем.
В данном же случае, используется ссылка на функцию, возвращающую значение. Значение живет на момент выхода из функции. Тут мы для него заводим новую ссылку. Ссылка - это алиас переменной, альтернативное имя. Так почему же объект должен быть уничтоженным, если переменная еще жива в текущем контексте (я говорю про тот момент, когда заводится ссылка const string& s = f();)? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Тут подсчет ссылок не используется, просто, компилятор располагает объект в стеке так, что-бы его время жизни было больше чем время жизни ссылок на него. Напомню, что это работает только для объектов в стеке.
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это написано в стандарте 12.2 Temporary objects
|
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы про std::string ? она не обладает подсчетом ссылок и не стоит путать с QString и wxString, которые построены по технологии COW (copy on write)
тут речь идет о случае const int & ri = 13; |
||||
|
|||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
самым верным способом будет проверить дизассемблированный текст и, как мне кажется, Lazin говорит правду, ибо компилятор, как только дойдет до строки
положит на стек объект, который будет определен возвращаемым функцией значением. Это будет кадр стека внешней функции, поэтому и время жизни - время жизни внешней функции -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
цитата то обрезана
только мне кажется эта цитата не объясняет.. ведь в примере по сылке временный объект создается внутри функции и соответсвенно время жизни должно определяться scope`ом той функции. Это сообщение отредактировал(а) mes - 17.3.2009, 15:34 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
время "жизни" объекта в стеке заканчивается тогда, когда выполняется mov esp,ebp/ret
данные в стеке непосредственно при этом никуда не пропадают, но при выполнении последующего кода они могут пропасть |
|||
|
||||
| InvalidProperty |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
wiki (string) - обладает. Во всяком случае, я не встречался с примерами, когда не обладает.
это вообще откуда взялось??? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||
|
|||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
xvr, спасибо. Этого я и ждал(сам не нашел :( ). Очередной идиотизм языка..
Добавлено через 2 минуты и 33 секунды
Добавлено через 3 минуты и 29 секунд это тебе ни о чем не говорит? |
||||
|
|||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
нед, там создается временный объект в том-же scop-e что и ссылка на него, объект возвращается по значению
как в примере, так делать можно
возвращать из ф-ии даже константную ссылку на временный объект нельзя Добавлено через 2 минуты и 35 секунд это не идиотизм языка, это нужно для того, что-бы лишний раз не копировать объект передаваемый по значению |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |