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.