Middle+
Маънии семантики ҳаракат ва чӣ гуна истифода бурданаш?
sobes.tech AI
Ҷавоб аз AI
Маънои ҳаракат (move semantics) дар C++11 ва версияҳои баъдӣ имкон медиҳад, ки моликияти манбаъҳоро аз як объект ба дигар ба таври муассир интиқол додан, бо эҳтиёҷ надоштани нусхабардории нолозим. Ин тавассути истифодаи истинодҳои rvalue (&&) ва оператори std::move ба даст меояд.
Аспектҳои асосӣ:
- истинодҳои rvalue (
&&): Истинодҳо ба объектҳои муваққатӣ (яъне, rvalues) ё объектҳое, ки ҳамчун интиқолшаванда нишон дода шудаанд. Имкон медиҳанд, ки ба объекте, ки ба зудӣ нобуд мешавад, пайванд созем. - оператори
std::move: тағир медиҳад, ки lvalue ба истиноди rvalue. Сам по себе, интиқолро иҷро намекунад, балки танҳо ба компилятор сигнал медиҳад, ки объектро бехатартар метавон интиқол дод. - Конструктори интиқол: конструктори махсус, ки истиноди rvalue-ро ҳамчун аргумент қабул мекунад. "Дуздида" манбаъҳоро (масалан, ишорагарҳои ба хотираи динамикӣ) аз объекти манбаъ, онро дар ҳолати эътиборнок, аммо холӣ мегузорад.
- оператори таъин бо интиқол: монанд ба конструктори интиқол, барои оператсияҳои таъин кардан истифода мешавад.
Истифода:
- Оптимизатсия: арзиши нусхабардории объектҳои калон ё объектҳое, ки манбаъҳоро доранд (масалан, контейнерҳо, сатрҳо, ишорагарҳои оқил).
- Иҷрои контейнерҳои муассир: имкон медиҳад, ки контейнерҳо, мисли
std::vector, дар идоракунии элементҳо дар тағирёбии андоза ё интиқол муассир бошанд. - Баргардонидани объектҳои калон бо арзиш: компилятор метавонад автоматӣ истифодаи интиқолро (оптимизатсияи арзиши баргардондан, RVO ё NRVO) дар ҳолате, ки объекти баргардондашуда як тағирёбани маҳаллӣ ё объекти муваққатӣ бошад, татбиқ кунад.
Масалан:
#include <iostream>
#include <vector>
#include <string>
#include <utility> // Барои std::move
class MyResource {
public:
std::vector<int> data;
// Конструктор
MyResource(size_t size) : data(size) {
std::cout << "Конструктор" << std::endl;
}
// Деструктор
~MyResource() {
std::cout << "Деструктор" << std::endl;
}
// Конструктори интиқол
MyResource(MyResource&& other) noexcept : data(std::move(other.data)) {
std::cout << "Конструктори интиқол" << std::endl;
}
// Оператор таъин бо интиқол
MyResource& operator=(MyResource&& other) noexcept {
if (this != &other) {
data = std::move(other.data);
}
std::cout << "Оператор таъин бо интиқол" << std::endl;
return *this;
}
};
int main() {
MyResource res1(10); // Конструктор
std::cout << "---" << std::endl;
MyResource res2 = res1; // Конструктор барои нусхабардорӣ ё оператор барои нусхабардории
std::cout << "---" << std::endl;
MyResource res3 = std::move(res1); // Конструктори интиқол
std::cout << "---" << std::endl;
MyResource res4(5); // Конструктор
res4 = std::move(res3); // Оператор барои таъин бо интиқол
std::cout << "---" << std::endl;
return 0;
}
Дар ин мисол, бо истифода аз std::move, оператори конструктор барои интиқол ё оператори таъин бо интиқол даъват мешаванд, ки имкон медиҳад, ки аз нусхабардории гарон дар мазмуни вектор data канорагирӣ шавад.