Если вы не хотите копировать, вы можете вместо этого переместить его:
struct BigClass {
void func() {
BigClass tmp;
*this = std::move(tmp);
}
};
Операция перемещения обычно не включает динамическое c выделение или копирование больших буферов.
Если вы следуете правилу нуля , для вас будет определен оператор назначения перемещения.
В противном случае вы всегда можете определить его с помощью оператора по умолчанию:
struct BigClass {
BigClass& operator=(BigClass&&) = default;
// ...
};
Вы также можете написать свой собственный оператор, но по умолчанию обычно выполняет свою работу очень хорошо.
struct BigClass {
// quite important ----v------v
BigClass& operator=(BigClass&& rhs) noexcept {
this->a = std::move(rhs.a);
this->b = std::move(rhs.b);
this->c = std::move(rhs.c);
}
// ...
};
Операция перемещения обычно очень быстрая и намного быстрее, чем new
.
Кроме того, вы также можете обновить объект и назначить ему указатель:
struct BigClass {
auto replace() -> BigClass* {
auto tmp = new BigClass{};
// ...
return tmp;
}
};
Остерегайтесь, так как он намного медленнее, поскольку включает динамическое распределение c.