|
Модераторы: Daevaorn |
|
ТарасАтавин |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Своп предполагает, что присваивание происходит сразу и слева на право, и наоборот, const запрещает всякое изменение правого операнда. Даже если эта пакость скомпилится, первая мысль при чтении такого безобразия будет или прямо противоположной, или, что опретор присваивания меняет оба операнда. А на, чтоб разобраться, уйдёт время. Убирать const - ещё хуже: оператор именно поменяет местами свои операнды, чего делать не должен. Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 14:37 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
Guinness |
|
|||
Опытный Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
ТарасАтавин, вообще-то, это классика как нужно писать оператор присваивания, чтобы делать его "безопасным для исключений"(тут с термином мог ошибиться, не помню как у Саттера там классификация идет). Более того, таким образом мы гарантируем, что и копирующий конструктор и оператор присваивания у нас делают одно и тоже.
А если конструкция не привычна для восприятия, то нужно привыкать. |
|||
|
||||
ТарасАтавин |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
{ MyClass(other).swap(*this); }[/code], конечно. Кстати, оператор присваивания обязан возвращать ссылку на this, так что ваша "классика" страдает грубым нарушением стандарта. Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 18:58 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
mes |
|
|||
любитель Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
правый операнд это other ? больше ничего с конст не нахожу..
и где ктор его меняет не дай бог попасть кому-нибудь к врачу с таким же 13 летним опытом... Добавлено через 2 минуты и 9 секунд
а как насчет того, чтоб читать между строк ? эта строчка с возвращением this никакой роли не влияет, потом в форумных примерах на коленке может быть безболезнено упущена Добавлено через 6 минут и 49 секунд ТарасАтавин, был тут на форуме уже докторКтоТоТам, тоже себя в грудь бил и кричал громче всех.. еще и книжки писал.. Вы еще не пробовали ? что ж ценный опыт пропадает ... |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
bsa |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ТарасАтавин, расскажи, что делает конструкция MyClass(*this)?
|
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
вообще-то любая функция, которая при возникновении исключений гарантирует отсутствие утечки ресурсов уже сама по себе является exception safe, так-как соответствует базовому правилу безопасности исключений Абрахамса (раз уж вспомнили Сатера, то Сатер в своей книге цитировал именно его). А сохранение состояния программы при возникновении исключений является строгой гарантией, которую можно обеспечивать а можно и нет, зависит от программы. |
|||
|
||||
azesmcar |
|
||||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Да, а что если это не тривиальный объект с двумя целочисленными типами а скажем что нибудь посложнее..ну например вот такой класс
Что буде на 21-ой строке, если он содержит мусор? Это сообщение отредактировал(а) azesmcar - 24.9.2013, 16:04 |
||||
|
|||||
ТарасАтавин |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
swap.
Добавлено @ 18:28 Даже если return *this спрятано внутри swap, реализация оператора присваивания не содержит этой операции, а по стандарту должна. Добавлено @ 18:31 И это говорит человек, игнорирующий return *this. Ну ка как должен повести себя
Добавлено через 10 минут и 20 секунд Копирует, да вот беда: анализ подобных мелочей занимает лишнее время, а по закону Мёрфи, гласящему что всё, что может быть понято не правильно, именно так и будет понято, кто нибудь обязательно его вообще не заметит. Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 18:34 -------------------- Не так всё плохо, как оно есть на самом деле. |
||||||
|
|||||||
ТарасАтавин |
|
|||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 18:48 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
bsa |
|
||||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ТарасАтавин, ты что к мелочам цепляешься? Тебе концепцию показывают. Естественно, что в нормальном коде должен быть и return *this. Он в данном случае не он главное. Главное, каким образом реализуется основная функциональность.
Что и куда копирует? Добавлено через 9 минут и 45 секунд
Объекты не думают. Они являются. И есть стандартное правило - освобождением ресурсов занимается тот, кто их выделяет. Исключение (условное) - умные указатели. Вот и объясни, зачем мучаться с malloc/new()/деструктор/free, когда можно использовать new/delete? Более того, можно использовать умные указатели, и в этом случае тебе достаточно будет сделать только new, а все остальное ляжет на плечи указателя. |
||||
|
|||||
ТарасАтавин |
|
||||
Опытный Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Именно с таким подходом его и не оказывается в коде релиза. И не только его, но и
Добавлено через 2 минуты и 36 секунд Какая разница? Речь о том, что код читается, как
-------------------- Не так всё плохо, как оно есть на самом деле. |
||||
|
|||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
не совсем, это слишком узко. правило в том, что у объекта должен быть хозяин (владелец), который управляет. выделение памяти может быть делегировано (фабрике например), делегировано может быть и освобождение (хотя это реже применяется). владение может передаваться, что и происходит с умными указателями. так что они не исключение, а подтверждение правила. Добавлено через 1 минуту это уже мозгоклюйство. ведь все всё поняли. |
|||
|
||||
bsa |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Где ты мусор тут нашел? Оператор присваивания ВСЕГДА оперирует с инициализированными объектами. Если какой-то негодяй не инициализирует объекты в конструкторе, то это его проблемы. Дальнейшие рассуждения по поводу качества кода с ним можно не продолжать. |
|||
|
||||
Lukkoye |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Существует миф, который заслуживает того, что бы его разоблачили. Действительно: вставка у листа быстрая. Однако, реализация со стандартным аллокатором задействует оператор new. Который черезвычайно медленный. Настолько медленный, что за это время можно несколько раз вставить элемент размеров в 32 байта и в количествt 1000 штук (я делал замеры по скорости, но это было давно и точных цифр не помню) в вектор путем копирования его элементов в право (расширение), при условии, что у вектора достаточно резерва и он не реалокнется. Таким образом, если вы используете стандартный аллокатор листа, который идет в с ним по дефолту, то по скорости работы на прикладных задачах он редко когда выигрывает у вектора. И никогда не выигрывает, если количество элементов - не велико. Использовать его ради достижения перфоманса имеет смысл, если вы используете свои аллокаторы с уже заранее зарезервированной памятью. И не имеете потерь на её выделение оператором new |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |