std::move
Megjelenés
Főnév
std::move (tsz. std::moves)
- (informatika) A
std::movea C++11-ben bevezetett standard könyvtári függvény, amely nem mozgat semmit — csak egy rvalue-re konvertál (azaz az érték átmeneti jellegét deklarálja a fordítónak). Ezáltal engedélyezi, hogy egy objektum erőforrásai áthelyezhetők legyenek egy másik objektumba.
📌 Definíció
template<typename T>
typename std::remove_reference<T>::type&& move(T&& arg) noexcept;
Ez egy univerzális referencia (T&&), amit egy rvalue-referenzává alakít. A move tehát egy cast, nem más.
🧪 Használat – példával
#include <iostream>
#include <string>
#include <utility> // std::move
int main() {
std::string a = "alma";
std::string b = std::move(a);
std::cout << "b = " << b << "\n"; // alma
std::cout << "a = " << a << "\n"; // üres vagy undefined állapot
}
Mi történt?
std::move(a)jelzi a fordítónak, hogya-t lehet „ellopni”- A
bmove konstruktorral átvesziaerőforrásait amegmarad, de már nem használható érdemben (definiált, de üres vagy érvénytelen állapotban van)
🎯 Mire való?
- Erőforrások (pl. heap memória) hatékony átvitelére másolás nélkül
- Ideiglenes objektumok vagy használat után eldobható objektumok átadására
- Teljesítményoptimalizálásra, különösen nagyméretű objektumoknál (pl.
std::vector,std::string, stb.)
🔍 Fontos: std::move nem mozgat
std::move csak annyit mond: “én ezt nem használom többet, nyugodtan vedd el tőlem.”
A tényleges mozgatást a move konstruktor vagy a move értékadó operátor végzi.
🛑 Tipikus hiba
std::string s1 = "alma";
std::string s2 = s1; // másolat
Ez itt másolás, nem mozgatás.
Ha viszont így írod:
std::string s2 = std::move(s1); // mozgatás
A s2 megkapja az erőforrást, a s1 pedig üres marad.
📎 Példa saját osztállyal
class MyClass {
std::string name;
public:
MyClass(std::string n) : name(std::move(n)) {} // mozgatjuk a stringet
};
🔁 Összefoglalás
| Elem | Jelentés |
|---|---|
std::move(x) |
Lvalue → Rvalue cast |
| Cél | Mozgathatóvá tenni egy változót |
| Mire jó? | Erőforrásátadás, hatékony teljesítmény |
| Tényleges munka | Move konstruktor vagy move operátor végzi |