Middle
Чӣ мешавад вақте ки объекти std::string-ро дар C++ кӯчонида мешавад?
sobes.tech AI
Ҷавоб аз AI
Ҳангоми std::string-ни кўчириш, мансубият (ресурс, ёдгорлик) манбаъ (асл) объектдан мақсадли объектга ўтказилади. Матннинг мазмунини (символлар) кўчириш ўрнига, фақат буферга ишора қилувчи кўрсаткич, унинг ўлчами ва ҳажми кўчирилади. Манба объект ҳозирда валид, аммо номуайян ҳолатда қолади (одатда, кўрсаткич нулга ўрнатилади, ва ўлчам ва ҳажм 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-ҳуқуқи ва махсус қурилмалар/операторлар) ёрдамида амалга оширилади.