Sobes.tech
Middle

Ի՞նչ է տեղի ունենում, երբ տեղափոխում եք std::string տիպի օբյեկտը C++-ում։

sobes.tech AI

Պատասխան AI-ից

Երբ տեղափոխում եք std::string, ռեսուրսի (հիշողության) սեփականությունը փոխանցվում է սկզբնական օբյեկտից նպատակային օբյեկտին: Փոխանակ պատճենելու տողի պարունակությունը (գծիկները), միայն պատկերը փոխանցվում է բուֆերի, դրա չափի և ծավալի: Արդյունքում, սկզբնական օբյեկտը գտնվում է վավեր, բայց անորոշ վիճակում (սովորաբար, ցուցիչը դառնում է nullptr, և չափը և ծավալը վերականգնվում են 0-ի), ինչը կանխում է հիշողության կրկնակի ազատումը: Սա զգալիորեն ավելի արագ է, քան ամբողջական պատճենը, հատկապես երկար տողերի համար:

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

int main() {
    std::string original = "Շատ երկար տող, որը չեք ուզում պատճենել";
    std::cout << "Առաջին (շարժումից առաջ): " << original << std::endl;

    // Շարժում ենք original- ը moved-ին
    std::string moved = std::move(original);

    std::cout << "Շարժված (շարժումից հետո): " << moved << std::endl;
    // original այժմ գտնվում է վավեր, բայց անորոշ վիճակում:
    // Փորձել օգտագործել original- ը շարժումից հետո առանց նախնական ինիցիալիզացիայի՝ անորոշ վարք է:
    // Բայց շատ իրականացմաններ այն վերականգնում են դատարկ վիճակի:
    // std::cout << "Առաջին (շարժումից հետո): " << original << std::endl; // Ապակել!

    return 0;
}

Շարժման կոնստրուկտոր կամ վերագրում գործողություն:

  • Թույլ է տալիս փոխանցել բուֆերի ցուցիչը նպատակային օբյեկտին:
  • Թույլ է տալիս փոխանցել չափը և ծավալը նպատակային օբյեկտին:
  • Սահմանում է սկզբնական օբյեկտի բուֆերի ցուցիչը nullptr-ին:
  • Սահմանում է սկզբնական օբյեկտի չափը և ծավալը 0-ով:

Այս ամենը իրականացնում է շարժման սեմանտիկայի շնորհիվ (rvalue-հղումներ և հատուկ կոնստրուկտորներ/օպերատորներ):