move assignment operator

Üdvözlöm, Ön a move assignment operator szó jelentését keresi. A DICTIOUS-ban nem csak a move assignment operator szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a move assignment operator szót egyes és többes számban mondani. Minden, amit a move assignment operator szóról tudni kell, itt található. A move assignment operator szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Amove assignment operator és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

move assignment operator (tsz. move assignment operators)

  1. (informatika) A move assignment operator C++-ban egy speciális operátor, amely lehetővé teszi egy objektum erőforrásainak átvételét (áthelyezését) egy másik objektumtól, ahelyett hogy lemásolná azokat. Ezzel elkerülhetjük a fölösleges másolásokat, ami különösen hasznos, ha az objektum nagy vagy drága erőforrásokat (például dinamikusan lefoglalt memóriát, fájl leírókat stb.) kezel.

Magyarul a move assignment operator jelentése: mozgató értékadó operátor (szokták még úgy is mondani: áthelyező értékadó operátor).

Miért van rá szükség?

Ha például egy objektum egy dinamikus tömböt tartalmaz, és az egyik objektumból a másikba értékadás történik, akkor:

  • másoló értékadásnál a tömb lemásolódna, ami költséges.
  • mozgató értékadásnál a tömb "átköltözik" az új objektumba, a régi pedig kiürül.

Szintaxis

A mozgató értékadó operátor a következőképpen néz ki:

ClassName& operator=(ClassName&& other) noexcept;
  • ClassName&& other — az argumentum egy rvalue reference (ideiglenes vagy költözhető objektum).
  • noexcept — opcionális, de ajánlott, hogy jelezze: a művelet nem dob kivételt.

Példa

#include <iostream>
#include <utility> // std::move

class MyVector {
    int* data;
    size_t size;

public:
    MyVector(size_t s) : size(s), data(new int) {
        std::cout << "Constructed\n";
    }

    ~MyVector() {
        delete data;
        std::cout << "Destroyed\n";
    }

    // Move assignment operator
    MyVector& operator=(MyVector&& other) noexcept {
        std::cout << "Move assignment\n";
        
        if (this != &other) {
            delete data; // töröljük a jelenlegi adatokat

            data = other.data; // átvesszük az erőforrást
            size = other.size;

            other.data = nullptr; // az eredeti objektumot "üresre állítjuk"
            other.size = 0;
        }
        return *this;
    }

    void print() const {
        std::cout << "Size: " << size << ", Data ptr: " << data << '\n';
    }
};

int main() {
    MyVector v1(5);
    MyVector v2(10);

    v2 = std::move(v1); // itt a move assignment operátor fog meghívódni
    
    v1.print(); // kiürült
    v2.print(); // átvette az erőforrásokat
}

Folyamat lépései

  1. Előző erőforrás törlése (ha van).
  2. Erőforrás átvétele az other objektumtól.
  3. other objektum "kiürítése", hogy ne próbálja meg kétszer felszabadítani ugyanazt a memóriát.

Összefoglalva

  • A mozgató értékadó operátor lehetővé teszi, hogy az objektumok hatékonyan "ellopják" egymás erőforrásait a másolás helyett.
  • Így jelentősen javítja a teljesítményt, főleg nagy objektumok esetén.
  • C++11-től érhető el a std::move és az rvalue referenciák bevezetésével.