rvalues ​​c ++ 0x и перемещение в кучу - PullRequest
0 голосов
/ 10 декабря 2010

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

Я понимаю, что перемещение работает и избегает копирования для всего, что происходит в стеке, но в конечном итоге большая часть работы со стеком дает некоторое значение, которое мы хотим скопировать в кучу, и я не думаю, что это перемещение работы.

Предполагая, что int имеет оператор присваивания перемещения, учитывая следующий код:

struct Foo
{
int x;
};

void doIt()
{
Foo* f = new Foo();
f->x = (2 + 4);
}

Таким образом, в этом примере r-значение, полученное из (2 + 4), можно предположительно перенести в f-> x вместо копирования. Хорошо отлично Но f и, следовательно, f-> x находятся в куче 1009 *, а это значение находится в стеке 1011 *. Кажется невозможным избежать копии. Вы не можете просто указать f-> x на память значения. Это значение будет сдуло, как только оно закончится. Копия кажется необходимой.

Так я прав, что копия будет сделана? Или я не прав? Или я полностью неправильно понял концепцию rvalue?

Ответы [ 3 ]

5 голосов
/ 10 декабря 2010

В этом случае он, вероятно, будет делать копию, но поскольку объект содержит только int, это не является большой проблемой.

Обычно вас интересует, когда объект содержит указатель на некоторые данные, которые размещены в куче (независимо от того, где расположен сам объект). В этом случае стоит избегать выделения новой копии этих данных (и поскольку они находятся в куче, даже если сам объект находится в стеке, вы можете перемещать его независимо от того, где находится сам объект).

3 голосов
/ 10 декабря 2010

Насколько я понимаю, перемещение не является противоположностью копированию : перемещение предпочтительнее, поскольку в большинстве случаев будет реализовано поверхностное копирование (вместо глубокого копирования ).

Если объект содержит указатель на некоторый ресурс, поверхностная копия копирует указатель, а глубокая копия копирует данные, на которые указывает указатель.Там всегда задействовано копирование: вопрос в том, «как глубоко мы должны идти».

Ваш пример включает только int: не существует такой вещи, как мелкая или глубокая копия int, так что здесь это не имеет значения.И действительно, вы правы, полагая, что перемещение имеет смысл только тогда, когда задействованы динамически распределенные ресурсы.

1 голос
/ 10 декабря 2010

Um.Локальные переменные находятся в стеке.Это ваше значение будет оптимизировано до 6, а в полученном двоичном файле, скорее всего, будет mov [dest], 6.

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