Является ли std :: swap атомарным в C ++ 0x из-за ссылок на значения? - PullRequest
7 голосов
/ 10 августа 2010

Поскольку у нас есть rvalue ссылки в C ++ 0x, мне кажется, что должна быть возможность реализовать std :: swap как атомарную операцию с CAS. Так ли это в новом стандарте, и если нет, то почему?

Ответы [ 3 ]

7 голосов
/ 10 августа 2010

Это не атомарно. Атомарные операции недешевы и в 99% случаев вам не нужна атомарность. Существуют (IIRC) некоторые другие способы получения атомарных операций, но std::swap() не является одним из них.

5 голосов
/ 10 августа 2010

Простой ответ: нет, не совсем.

Хотя вы можете использовать CAS для реализации атомарных операций, в большинстве случаев вам придется перепроектировать часть реализации, чтобы сделать это, и в большинстве случаев вы будете влиять на производительность во всех случаях.

Рассмотрим текущую реализацию вектора в g ++. Он содержит три указателя: begin, end, end_of_capacity. Как бы вы сделали swap атомным для такого вектора? Вы можете упростить ситуацию, поместив все три указателя в динамически распределенный блок памяти, а затем реализовать атомарный swap будет проще, просто поменяйте местами указатели. Проблема заключается в том, что вы добавили дополнительное выделение памяти для контейнера и дополнительную операцию разыменования при каждом доступе через контейнер (итераторы будут работать аналогично исходной реализации).

Прочитайте на этом ответ от FredOverflow для простого объяснения семантики перемещения .

1 голос
/ 10 августа 2010

Не каждый класс может иметь оператор присваивания перемещения, который может быть реализован более эффективно, чем обычный оператор присваивания.Пример std::array, который имеет собственный массив в качестве члена.Другой случай - std::string, где используется оптимизация небольших строк (для небольших строк).

Поэтому обычно вы не можете ничего сказать о std::swap с семантикой перемещения, которую вы не могли бы сказать о std::swap в C ++ 98.В некоторых случаях это будет лучше, но не в общем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...