Wat gebeurt er bij het verplaatsen van een std::string-object in C++?
sobes.tech AI
Antwoord van AI
Wanneer een std::string wordt verplaatst, wordt het eigendom van de bron (geheugen) overgedragen van het oorspronkelijke object naar het doelobject. In plaats van de inhoud van de string (tekens) te kopiëren, wordt alleen de pointer naar de buffer, de grootte en de capaciteit gekopieerd. Het oorspronkelijke object bevindt zich dan in een geldige, maar ongedefinieerde toestand (meestal wordt de pointer nul, en de grootte en capaciteit worden op nul gezet), wat dubbele vrijgave van geheugen voorkomt. Dit is veel sneller dan volledige kopie, vooral voor lange strings.
#include <string>
#include <iostream>
#include <utility>
int main() {
std::string original = "Een zeer lange string die je niet wilt kopiëren";
std::cout << "Origineel (voor verplaatsing): " << original << std::endl;
// Verplaats original naar moved
std::string moved = std::move(original);
std::cout << "Verplaatst (na verplaatsing): " << moved << std::endl;
// original is nu in een geldige, maar ongedefinieerde toestand.
// Proberen original te gebruiken na verplaatsing zonder initialisatie is ongedefinieerd gedrag.
// Echter, veel implementaties zetten het terug naar een lege toestand.
// std::cout << "Original (na verplaatsing): " << original << std::endl; // Gevaarlijk!
return 0;
}
Verplaatsconstructeur of toewijzingsoperator:
- Kenmerkt de pointer naar de buffer toe aan het doelobject.
- Kenmerkt de grootte en capaciteit toe aan het doelobject.
- Stelt de pointer naar de buffer van het bronobject in op
nullptr. - Stelt de grootte en capaciteit van het bronobject in op 0.
Dit wordt geïmplementeerd dankzij de verplaatsingssemantiek (rvalue-referenties en speciale constructors/operators).