C ++ 11 ссылочная адресация rvalue

0
задан corsel 13 July 2018 в 16:42
поделиться

1 ответ

У каждого объекта есть свой собственный адрес. Поскольку bar и retVal - разные объекты, у них разные адреса. Перемещение не изменяет адрес объекта.

. Что такое перемещение, это позволяет перемещать кишки объекта с одного объекта на другой. В зависимости от того, как создается класс, это может быть очень большим повышением производительности. Например, если у нас есть класс, подобный std::vector, он будет иметь указатель на него в выделенном хранилище. Перемещение позволяет просто скопировать указатель и размер с перемещенного объекта с перемещенного на объект. Затем вы просто устанавливаете указатель в перемещенном объекте на нулевой указатель и задаете размер 0. Теперь нам не нужно было копировать какие-либо элементы или выделять какое-либо хранилище, которое нам пришлось бы делать, если бы мы делали копию вместо .

3
ответ дан NathanOliver 17 August 2018 в 12:23
поделиться
  • 1
    Таким образом, это полезно, когда я реализую операцию копирования указателя-члена внутри конструктора перемещения, правильно? Например, когда у меня есть большой динамический массив внутри MyOtherClass, и вместо того, чтобы копировать содержимое один за другим, я просто копирую указатель и предотвращаю вызов деструктора? – corsel 13 July 2018 в 16:54
  • 2
    @corsel Это то, что перемещение действительно сияет. Небольшое предостережение, однако, вы не останавливаете перемещение объекта от объекта, вы просто помещаете его в состояние, в котором его можно разрушить, не затрагивая объект, в который вы только что переместили кишки. Обычно перемещение меньше или равно стоимости копирования. – NathanOliver 13 July 2018 в 16:57
  • 3
    Ну, ну, скажем, у возвращаемого локального объекта есть определенный ~MyOtherClass, в котором его указатели-члены - delete[] d. После выхода он выходит из сферы видимости, что теперь? Компилятор видит, что выходит из области видимости, содержимое перемещается, заканчивается вызов деструктора? – corsel 13 July 2018 в 17:01
  • 4
    @corsel Если вы установите указатель на std::nullptr, то delete и delete[] станут нерабочими. – NathanOliver 13 July 2018 в 17:17
  • 5
    @corsel Конструктор перемещения помещает перемещенное из объекта в состояние, в котором безопасно уничтожить и что разрушение не повлияет на перемещенный объект. – NathanOliver 13 July 2018 в 17:19
Другие вопросы по тегам:

Похожие вопросы: