powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идиома copy-on-swap С++
14 сообщений из 39, страница 2 из 2
Идиома copy-on-swap С++
    #38879490
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Это все верно для ссылочной семантики.
А для семантики значений не применимо.

Например, я бы не хотел возиться со смарт-указателями на std::string. Я хочу просто работать со значениями std::string.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879491
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом естественно смарт-указатели полезны при реализации внутренностей таких классов.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879507
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyя бы не хотел возиться со смарт-указателями на std::string. Я хочу
просто работать со значениями std::string.
Так std::string и есть смарт-указатель на char[], обвешанный другими методами для удобства
работы с ним.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879513
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Нет. У строки нет семантики указателей. Ее например нельзя разыменовать.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879872
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкачу-ка я свои пять копеек. Эта идиома нужна, чтобы обеспечить т.н. "strong exception safety guarantee". Это гарантия того, что операция не портит исходные объекты. Никогда. Они всегда всегда находятся в консистентном состоянии. В случае успеха вы получаете "новое хорошее" состояние. В случае неуспеха - "старое хорошее" (но обработку исключений ни кто не отменял). И исключает случай, когда старое "уже подпортили", а "новое недособрали". Зачем это? Почему не "ручками"? Ок, вот представьте, произошло исключение, вы пытаетесь вернуть объект в "хорошее" состояние, определяете "подпорченные части" и пытаетесь восстановить их, и ваша попытка "вдруг" генетит исключение. Тогда логика восстановления будет, мягко говоря, нетривиальной.

Что интересно, ранее контейнер ака vector такую гарантию ("strong exception safety guarantee") и предоставлял. Теперь (в новом стандарте) - нет, из-за появления movable семантики.

По примеру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
friend void swap(T& a, T& b)
{
	using std::swap;
	swap(a.f1, b.f1);
	swap(a.f2, b.f2);
	swap(a.f3, b.f3);
}


swap может выбросить исключение, так что в этом примере может получиться "частично обменявшийся" вариант ...
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879891
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaЧто интересно, ранее контейнер ака vector такую гарантию ("strong exception safety guarantee") и предоставлял. Теперь (в новом стандарте) - нет, из-за появления movable семантики.
Как раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений.
А в старом этого нет, но там по факту все реализации не выбрасывали исключения.
И гарантии эти получили возможность предоставить как раз из-за появления movable.
Т.е. все строго наоборот по отношению к тому что вы сказали ))
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38879901
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По смыслу это близко к попытке ввести "транзактивность" в работу с объектами.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880131
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКак раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений.


Это очень легко проверить. Смотрим спецификацию (для >С++11)
http://en.cppreference.com/w/cpp/algorithm/swap
Код: plaintext
1.
2.
3.
4.
5.
noexcept(

    std::is_nothrow_move_constructible<T>::value &&
    std::is_nothrow_move_assignable<T>::value
)



И видим, что swap не выбрасывает исключений тогда и __только__ __тогда__, когда не выбрасывают исключения movable-конструктор ("перемещающий" конструктор) и movable оператор присваивания ("перемещающий" оператор присваивания). Т.о., swap _НЕ_даёт гарантию отсутствия исключений.

Anatoly MoskovskyИ гарантии эти получили возможность предоставить как раз из-за появления movable.

Это утверждение я даже комментировать не буду. Movable-семантика позволила исключить дорогостоющую операцию копирования (дорогостоющую - как за счёт процессорного времени на её выполнение, так и дополнительной памяти под "лишнюю" переменную) во временный объект. Это сделало swap более быстрым на не-POD типах и менее требовательным к памяти. Но другой ценой: если раньше в процессе копирования во временную переменную происходило исключение, оно не "портило" оригинальные данные. Сейчас же появление исключения при перемещении (а не копировании, как было раньше) во временный объект __портит__ исходный объект, т.к. суть перемещения - "кража" содержимиого у одного объекта в пользу другого. Обращение "по старому имени" после выполнение move - в общем случае UB.

Anatoly MoskovskyТ.е. все строго наоборот по отношению к тому что вы сказали ))
Анатолий, вы поторопились. Всё наоборот как раз у Вас :)
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880266
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специально для вас выделяю то что вам не понятно
Anatoly Moskovskyswap над std объектами гарантировано не выбрасывает исключений.
Потому что std классы move_constructible и move_assignable.
Таким образом, объект либо стандартный и для него swap не кидает исключения, либо объект нестандартный и вы для него либо делаете move-конструктор и move-присвоение и используете std::swap, либо пишете свой swap который не кидает исключения.
При этом, для любых классов которые вообще позволяют присвоение можно написать swap, небросающий исключения, так же как и move-конструктор и move-присвоение .
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880302
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСпециально для вас выделяю то что вам не понятно
Anatoly Moskovskyswap над std объектами гарантировано не выбрасывает исключений.
Потому что std классы move_constructible и move_assignable.


Анатолий, не болтайте ерундой. Простейший пример (берём любую специализацию swap):
http://en.cppreference.com/w/cpp/utility/tuple/swap2
Код: plaintext
1.
2.
noexcept specification:  
noexcept(noexcept(lhs.swap(rhs)))



И так практически в каждой специализации. НУ НЕТ ТАМ гарантии - сплошные зависимости. Потому это зависит от реализации. Сделать STL "без выбрасывания исключений" под все платформы практически невозможно. Но некоторым можно попробовать утверждать, что std::tuple не из STL ...
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880328
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaНУ НЕТ ТАМ гарантии - сплошные зависимости
Ну не смогли вы раскрутить зависимости и увидеть в них гарантии. Ничего страшного, зайдите с другой стороны.
Попробуйте, например привести пример std класса, который можно присваивать, и одновременно в стандарте не указано что для него выполняются все требования noexcept в std::swap ( move-constructible и move-assignable).

Все эти зависимости и условия, на которые вы ссылаетесь, они там потому что STL это библиотека шаблонов и она естественно не может давать гарантий по отношению к любым переданным аргументам шаблонов. Но если все аргументы шаблонов - классы std то такие гарантии прямо следуют из стандарта.

BagaBagaСделать STL "без выбрасывания исключений" под все платформы практически невозможно
Я не говорил что в STL не выбрасываются исключения.
Если вам хочется на эту тему поспорить, то оставляю вас наедине с самим собой, как с автором сего утверждения.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880395
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий, вы Ваньку валяете?

- "Как раз теперь, в стандарте С++11 swap над std объектами гарантировано не выбрасывает исключений."
Именно в стандарте _ДО_ С++11 swap имел спецификафию throw(), т.е. пустую. К сожалению, это не соответствовало грубой действительности - там всё равно порождались исключения... Изменения в новом стандарте просто отразили этот факт.

Что гарантирует спецификация nothrow? Строго говоря - почти ничего. С её помощью _программист_ зуб даёт сообщает компилятору, что код не генерирует исключение. Благодаря этому компилятор может сделать некоторые оптимизации (прежде всего, на стеке). Если код заявлен как noexcept, но всё равно генерит исключение... Ок - это Ваша нога.

Далее. Исключение в swap могут бросать вызываемые там функции (о да, я КЭП). И новая спецификация это явным образом указывает. Мы уже посмотрели:
1. стандартный swap не объявлен как noexcept() - отражает зависимости от "нутра"
2. специализированный swap не объявлен как noexcept() - отражает зависимости
3. конструктор перемещения не объявлен как noexcept(). Можете заглянуть в пецификацию сами - мне лень сюда копипастить.
4. перемещающий оператор присваивания не объявлен как noexcept(). Можете заглянуть в пецификацию сами.

Разумеется, на каждый довод у Вас есть шанс попросить "копнуть глубже". Чтобы тянуть время и увиливать. Но всё куда проще.

Во-первых, можно сразу спуститься к "силикону". Что вы будете делать с аппаратным исключением? Куда "копать глубже"?

Во-вторых, вы сами признали, что сделать STL без исключений (в т.ч. для перемещающих конструкторов и операторов копирования) невозможно. Как же тогда вы собрались обеспечить noexcept swap, ведь его "безысключительность" полностью базируется на невыбрасывании исключений "нутром"?

В третьих, если стандарт что-то гарантирует, он это прописывает явным образом. Хотелось бы увидеть пункт стандарта (или его номер), который предоставляет эту гарантию , цитирую: " если все аргументы шаблонов - классы std то такие гарантии прямо следуют из стандарта."
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38880522
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaвы сами признали, что сделать STL без исключений (в т.ч. для перемещающих конструкторов и операторов копирования) невозможно
Оставляю вас. Вам видимо интересно спорить с придуманными вами утверждениями. Мне - нет.
...
Рейтинг: 0 / 0
Идиома copy-on-swap С++
    #38881084
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное, чтобы топикстартеру польза была.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идиома copy-on-swap С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]