Sobes.tech
Middle

Mida juhtub std::string tüüpi objekti liigutamisel C++-s?

sobes.tech AI

Vastus AI-lt

Kui std::string liigub, toimub ressursi (mälu) omandi üleandmine algsest objektist sihtobjektile. Selle asemel, et kopeerida stringi sisu (märke), kopeeritakse ainult buferi näitaja, selle suurus ja maht. Algne objekt muudetakse kehtivaks, kuid määramatuks olekuks (tavaliselt muutub näitaja nulliks, suurus ja maht lähtestatakse), mis takistab topeltmälu vabastamist. See on oluliselt kiirem kui täielik kopeerimine, eriti pikkade stringide puhul.

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

int peamine() {
    std::string algne = "Väga pikk string, mida ei taha kopeerida";
    std::cout << "Algne (enne liikumist): " << algne << std::endl;

    // Liigutame algse sihtobjektiks
    std::string liigutatud = std::move(algne);

    std::cout << "Liigutatud (pärast liikumist): " << liigutatud << std::endl;
    // algne on nüüd kehtiv, kuid määramatul seisundil.
    // Katsetada kasutada algset pärast liikumist ilma eelnevalt
    // initsialiseerimata on määramatult käitumist.
    // Kuid sageli lähtestab see selle tühja olekusse.
    // std::cout << "Algne (pärast liikumist): " << algne << std::endl; // Ohtlik!

    return 0;
}

Liigutav konstruktor või omistamisoperaator:

  • Omistab sihtobjekti bufera näitaja.
  • Omistab sihtobjekti suuruse ja maht.
  • Seadistab algse objekti bufera näitaja nullptr-ks.
  • Seadistab algse objekti suuruse ja maht nulliks.

See realiseeritakse liikumise semantikaga (rvalue-viited ja spetsiaalsed konstruktorid/operaatorid).