Middle
C++ da std::string turidagi ob'ektni ko'chirishda nima bo'ladi?
sobes.tech AI
AIdan javob
std::string ni ko'chirilganda, resurs (xotira) mulkiyati asl obyektdan maqsadli obyekga o'tkaziladi. Matnning mazmunini (belgilarni) ko'chirish o'rniga, faqat buferga ishora qiluvchi ko'rsatkich, uning o'lchami va sig'imi ko'chiriladi. Asl obyektda valid, ammo noma'lum holat yuzaga keladi (odatda, ko'rsatkich nullga aylantiriladi, va o'lcham ham sig'im ham nolga tenglashtiriladi), bu esa ikki marta xotira bo'shatishni oldini oladi. Bu to'liq ko'chirishdan ancha tezroq, ayniqsa uzun matnlar uchun.
#include <string>
#include <iostream>
#include <utility>
int main() {
std::string original = "Juda uzun matn, uni ko'chirmoqchi emasligingiz";
std::cout << "Asl (oldin ko'chirishdan): " << original << std::endl;
// originalni moved ga o'tkazamiz
std::string moved = std::move(original);
std::cout << "O'tkazildi (keyin ko'chirish): " << moved << std::endl;
// original endi valid, ammo noma'lum holatda.
// Ko'chirishdan keyin originalni ishlatish noma'lum xatti-harakat.
// Biroq, ko'plab implementatsiyalar uni bo'sh holatga qaytaradi.
// std::cout << "Asl (ko'chirishdan keyin): " << original << std::endl; // Xatarli!
return 0;
}
Ko'chirish konstruktor yoki tayinlash operatori:
- Maqsadli obyektdagi buferga ko'rsatkichni tayinlaydi.
- Maqsadli obyektdagi o'lcham va sig'imni tayinlaydi.
- Manba obyektdagi bufer ko'rsatkichini
nullptrga o'rnatadi. - Manba obyektdagi o'lcham va sig'imni 0 ga o'rnatadi.
Bu, ko'chirish semantikasi (rvalue-yo'nalishlar va maxsus konstruktorlar/operatorlar) yordamida amalga oshiriladi.