Sobes.tech
Middle+

Маънии семантики ҳаракат ва чӣ гуна истифода бурданаш?

sobes.tech AI

Ҷавоб аз AI

Маънои ҳаракат (move semantics) дар C++11 ва версияҳои баъдӣ имкон медиҳад, ки моликияти манбаъҳоро аз як объект ба дигар ба таври муассир интиқол додан, бо эҳтиёҷ надоштани нусхабардории нолозим. Ин тавассути истифодаи истинодҳои rvalue (&&) ва оператори std::move ба даст меояд.

Аспектҳои асосӣ:

  • истинодҳои rvalue (&&): Истинодҳо ба объектҳои муваққатӣ (яъне, rvalues) ё объектҳое, ки ҳамчун интиқолшаванда нишон дода шудаанд. Имкон медиҳанд, ки ба объекте, ки ба зудӣ нобуд мешавад, пайванд созем.
  • оператори std::move: тағир медиҳад, ки lvalue ба истиноди rvalue. Сам по себе, интиқолро иҷро намекунад, балки танҳо ба компилятор сигнал медиҳад, ки объектро бехатартар метавон интиқол дод.
  • Конструктори интиқол: конструктори махсус, ки истиноди rvalue-ро ҳамчун аргумент қабул мекунад. "Дуздида" манбаъҳоро (масалан, ишорагарҳои ба хотираи динамикӣ) аз объекти манбаъ, онро дар ҳолати эътиборнок, аммо холӣ мегузорад.
  • оператори таъин бо интиқол: монанд ба конструктори интиқол, барои оператсияҳои таъин кардан истифода мешавад.

Истифода:

  1. Оптимизатсия: арзиши нусхабардории объектҳои калон ё объектҳое, ки манбаъҳоро доранд (масалан, контейнерҳо, сатрҳо, ишорагарҳои оқил).
  2. Иҷрои контейнерҳои муассир: имкон медиҳад, ки контейнерҳо, мисли std::vector, дар идоракунии элементҳо дар тағирёбии андоза ё интиқол муассир бошанд.
  3. Баргардонидани объектҳои калон бо арзиш: компилятор метавонад автоматӣ истифодаи интиқолро (оптимизатсияи арзиши баргардондан, 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 канорагирӣ шавад.