Junior — Middle
Pode explicar como a semântica de movimentação de objetos é implementada em C++?
sobes.tech IA
Resposta da IA
A semântica de movimento (move semantics) em C++ permite transferir recursos (por exemplo, memória) de um objeto para outro de forma eficiente sem cópia. Isso é realizado usando referências rvalue e construtores e operadores de movimento especiais.
Pontos principais:
- O construtor de movimento aceita uma referência rvalue (
Type&&) e 'toma' os recursos do objeto temporário. - Após o movimento, o objeto original permanece em um estado válido, mas indefinido (geralmente com recursos nulos ou vazios).
Exemplo:
class Buffer {
char* data;
size_t size;
public:
Buffer(size_t s) : size(s), data(new char[s]) {}
~Buffer() { delete[] data; }
// Construtor de movimento
Buffer(Buffer&& other) noexcept : data(other.data), size(other.size) {
other.data = nullptr;
other.size = 0;
}
// Operador de movimento
Buffer& operator=(Buffer&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
// Proibir cópia para maior clareza
Buffer(const Buffer&) = delete;
Buffer& operator=(const Buffer&) = delete;
};
Dessa forma, o movimento evita custos de cópia de recursos grandes, melhorando o desempenho.