Sobes.tech
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).