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-հղումներ և հատուկ կոնստրուկտորներ/օպերատորներ):