Sobes.tech
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.