Sobes.tech
Middle

Kas notiek, pārvietojot std::string tipu objektu C++?

sobes.tech AI

Atbilde no AI

Kad std::string tiek pārvietots, resursa (atmiņas) īpašums tiek pārnests no sākotnējā objekta uz galamērķa objektu. Tā vietā, lai kopētu virknes saturu (simbolus), tiek kopēts tikai bufera norādītājs, tā izmērs un ietilpība. Sākotnējais objekts šādā gadījumā tiek padarīts derīgs, bet nenoteiktā stāvoklī (parasti norādītājs kļūst nulles, izmērs un ietilpība tiek atiestatīti), kas novērš dubultu atmiņas atbrīvošanu. Tas ir būtiski ātrāk nekā pilnīga kopēšana, īpaši garām virkņu gadījumā.

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

int galvenais() {
    std::string oriģināls = "Ļoti gara virkne, kuru nevēlas kopēt";
    std::cout << "Oriģināls (pirms pārvietošanas): " << oriģināls << std::endl;

    // Pārvieto oriģinālu uz moved
    std::string pārvietots = std::move(oriģināls);

    std::cout << "Pārvietots (pēc pārvietošanas): " << pārvietots << std::endl;
    // oriģināls tagad ir derīgs, bet nenoteiktā stāvoklī.
    // Mēģinājums izmantot oriģinālu pēc pārvietošanas bez iepriekšējas
    // inicializācijas ir nenoteikts uzvedības stāvoklis.
    // Tomēr bieži realizācija to atiestatī uz tukšu stāvokli.
    // std::cout << "Oriģināls (pēc pārvietošanas): " << oriģināls << std::endl; // Bīstami!

    return 0;
}

Pārvietojošais konstruktors vai operatora piešķiršana:

  • Piešķir mērķa objekta bufera norādītāju.
  • Piešķir mērķa objekta izmēru un ietilpību.
  • Iestata sākotnējā objekta bufera norādītāju uz nullptr.
  • Iestata sākotnējā objekta izmēru un ietilpību uz 0.

Tas tiek realizēts, izmantojot pārvietošanas semantiku (rvalue saites un īpašus konstruktus/operators).