Для MoveTest, как вы его определили, на самом деле не так много операций, которые могут оптимизировать (или вообще делать), что может действительно сделать, это копирование из исходного пункта назначения.
Перемещение - это большая победа, когда объект содержит указатель на кучу внешней памяти, которая (например) выделена в куче. В этом случае оператор перемещения ctor/assign может в основном выполнять мелкую копию (т. Е. Просто захватить указатель из перемещенного объекта) вместо глубокой копии (копируя все данные, на которые указывает этот указатель).
Например:
class move_tst {
int *buffer;
static const int size = 1024 * 1024;
public:
move_tst() {
buffer = new int[size];
std::iota(buffer, buffer + size, 0);
}
move_tst(move_tst const &other) {
buffer = new int[size];
std::copy_n(other.buffer, size, buffer);
}
#ifdef MOVE
move_tst(move_tst &&other) {
buffer = other.buffer;
other.buffer = nullptr;
}
#endif
~move_tst() {
delete [] buffer;
}
};
Оговорка: Я использовал необработанный вызов new
и сырой указатель здесь так ничего не вовлекается и мы не будем (к примеру) получить движение семантики любезности умный указатель. Для нормального кода при нормальных обстоятельствах вы должны использовать , а не, либо использовать (необработанный указатель или необработанный вызов new
, я имею в виду).
Редактировать: насколько это возможно std::move
, он фактически не выполняет движение - он просто сигнализирует о том, что вы больше не заботитесь о значении, поэтому он может быть источником движения, даже если это разрушает его ценность.
Например, в описанном выше классе, вы могли бы сделать тест, как:
for (int i = 0; i < 1000; i++) {
move_tst src;
move_tst dst =src;
}
... и сравнить его:
for (int i = 0; i < 1000; i++) {
move_tst src;
move_tst dst = std::move(src);
}
Без std::move
, dst
будет создана копия src
, но с std::move
, она сможет совершить переход от src
до dst
.
вы не можете проверить перемещение, взяв адрес. то, что перемещено, является внутренней структурой, которая вам не видна. –
Перемещение конструкции не делает то, что вы думаете. То, что он делает, заключается в том, чтобы значение в месте назначения было равно значению изначально на источнике, таким образом, чтобы было разрешено изменять источник. Он не изменяет адрес адресата или источника. Элемент данных 'var' является частью объекта' MoveTest', и его адрес всегда находится где-то внутри объекта, к которому он принадлежит. –
, потому что ваш конструктор движений ничего не движет. копирование bool просто копирует bool, вы получите разные адреса. – yngccc