Sobes.tech
Middle

Mi történik a std::string típusú objektum mozgatásakor C++-ban?

sobes.tech MI

Válasz az MI-től

Amikor egy std::string-et áthelyezünk, az erőforrás (memória) tulajdonjoga átkerül a forrásobjektumtól a célozatra. Ahelyett, hogy a karakterlánc tartalmát (karaktereket) másolnánk, csak a pufferre mutató mutatót, annak méretét és kapacitását másoljuk. A forrásobjektum ekkor érvényes, de nem meghatározott állapotban van (általában a mutató nullára lesz állítva, a méret és a kapacitás nullára lesz állítva), ez megakadályozza a memória kétszeri felszabadítását. Ez sokkal gyorsabb, mint a teljes másolás, különösen hosszú karakterláncok esetén.

#include <string>
#include <iostream>
#include <utility>

int main() {
    std::string original = "Nagyon hosszú karakterlánc, amit nem akarsz másolni";
    std::cout << "Eredeti (mielőtt mozgatnánk): " << original << std::endl;

    // Az originalt moved-be mozgatjuk
    std::string moved = std::move(original);

    std::cout << "Mozgatott (után a mozgatás): " << moved << std::endl;
    // az original most érvényes, de nem meghatározott állapotban van.
    // Az original használata mozgatás után, inicializálás nélkül, nem meghatározott viselkedés.
    // Azonban sok implementáció nullázza le.
    // std::cout << "Eredeti (mozgatás után): " << original << std::endl; // Veszélyes!

    return 0;
}

Mozgató konstruktor vagy értékadó operátor:

  • A puffer mutatóját a célobjektumhoz rendeli.
  • A célobjektum méretét és kapacitását állítja be.
  • A forrásobjektum puffer mutatóját nullptr-re állítja.
  • A forrásobjektum méretét és kapacitását 0-ra állítja.

Ez a mozgatás szémantika (rvalue- referencia és speciális konstruktorok/operátorok) segítségével valósul meg.