Middle
Čo sa deje pri presune objektu typu std::string v C++?
sobes.tech AI
Odpoveď od AI
Pri presune std::string sa zdroja na cilj, se vlasništvo nad resursom (memorijom) prenosi iz izvornog objekta u ciljni. Umesto kopiranja sadržaja niza (znakova), kopira se samo pokazivač na buffer, njegov veličina i kapacitet. Izvorni objekat ostaje u validnom, ali neodređenom stanju (obično, pokazivač postaje null, a veličina i kapacitet se resetuju na 0), što sprečava dvostruko oslobađanje memorije. Ovo je znatno brže od potpunog kopiranja, posebno za duge nizove.
#include <string>
#include <iostream>
#include <utility>
int main() {
std::string original = "Veoma dugačak niz koji ne želite da kopirate";
std::cout << "Original (pre preseljenja): " << original << std::endl;
// Preselimo original u moved
std::string moved = std::move(original);
std::cout << "Preseljen (nakon preseljenja): " << moved << std::endl;
// original sada je u validnom, ali neodređenom stanju.
// Pokušaj korišćenja original nakon preseljenja bez inicijalizacije je neodređeno ponašanje.
// Međutim, mnoge implementacije ga resetuju u prazno stanje.
// std::cout << "Original (nakon preseljenja): " << original << std::endl; // Opasno!
return 0;
}
Konstruktor za preseljenje ili operator dodeljivanja:
- Dodeljuje pokazivač na buffer ciljanom objektu.
- Dodeljuje veličinu i kapacitet ciljanom objektu.
- Postavlja pokazivač na buffer izvornog objekta na
nullptr. - Postavlja veličinu i kapacitet izvornog objekta na 0.
Ovo se implementira zahvaljujući semantici preseljenja (rvalue-referencama i posebnim konstruktorima/operatorima).