Перемещает ли семантика C ++ 11 избыточную идиому копирования-на-записи? - PullRequest
4 голосов
/ 08 декабря 2011

Я мог бы запутаться здесь, но я понял, что:

  • COW будет возвращать "поддельную" копию, пока один из абонентов не захочет внести некоторые изменения.
  • Move Semantic будет возвращать «поддельную» копию во всех случаях.

Так что, если моя цель состоит в том, чтобы иметь объект, который нужно только читать и не обновлять, я должен только ждать поддержки семантики перемещения вмои компиляторы C ++?

Я прав?

Спасибо:)

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Семантика перемещения не возвращает «поддельную» копию.Вместо этого в операции копирования он дает разрешению копирующему лицу удалить оригинальную копию.

Может быть полезным мотивирующий пример:

std::vector<int> bigData;

// fill bigData

std::vector<std::vector<int> > listOfData;

listOfData.push_back(std::move(bigData));
// after this point, the contents of bigData are unspecified (however accessing it is _not_ undefined behavior)

Без семантики перемещения вам нужно будет копироватьbigData, чтобы вставить его в listOfData, или вручную переворачивать с swap() в новый пустой вектор, который находится в listOfData.Но с семантикой перемещения, rvalue-reference-constructor (он же конструктор перемещения) std::vector, вызываемый push_back при копировании в новые данные, имеет разрешение на удаление старого содержимого bigData - таким образом, это разрешенонапример, украсть внутренний указатель bigData и сбросить bigData на пустой вектор.

Семантика перемещения обычно быстрее, чем семантика COW, так как им не нужно поддерживать счетчик ссылок для общего доступа, читатьтолько данные.Однако они более ограничены - вы не можете создать несколько псевдонимов с подсчетом ссылок для своих данных с помощью семантики перемещения, вы можете просто и просто перемещать данные между контейнерами.

Также обратите внимание, что обе последние версии GCCи Microsoft Visual C ++ поддерживают rvalue ссылки и семантику перемещения (GCC с --std=c++0x), поэтому нет оснований не начинать использовать их сегодня.

0 голосов
/ 08 декабря 2011

конструкторы копирования-записи и перемещения - это разные вещи.

Давайте поговорим о строках, где реализации COW широко распространены.Допустим, у вас есть реализация строки, которая поддерживает COW и перемещает семантику.Рассмотрим этот код:

cow::string foo() { return string("foo"); } // move CTOR is in effect here.

cow::string a = foo(); // move ctor in effect
cow::string b = a; // copy ctor in effect

a и b здесь будут использовать одну и ту же распределенную последовательность символов.В то время как здесь

std::string foo() { return string("foo"); } // move CTOR is in effect here.

std::string a = foo(); // move ctor in effect
std::string b = a; // copy ctor in effect

a и b будут выделять и хранить две разные последовательности символов, удваивая потребление памяти.

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