ムーブセマンティクス: 効率的な所有権移動
C++11の革命。コピー不要の高速転送。
ムーブ
リソースの所有権を移動。コピーより高速。
右辺値参照
&& で表す。一時オブジェクトをバインド。
noexcept
ムーブ操作は例外を投げないことを保証。
ムーブとは?
#include <utility>#include <vector>#include <string>
std::string create() { std::string s = "Hello"; return s; // 自動でムーブ(RVO)}
std::vector<int> v1 = {1, 2, 3};std::vector<int> v2 = std::move(v1); // v1 は空に効果
コピー: O(n) ムーブ: O(1)
Bad
// ❌ Bad: 不要なコピーvoid process(std::vector<int> data) { // コピー発生 // ...}Good
// ✅ Good: ムーブで効率化void process(std::vector<int>&& data) { auto local = std::move(data); // 所有権を移動}クラスでの実装
class Buffer { int* data_; size_t size_;public: // ムーブコンストラクタ Buffer(Buffer&& other) noexcept : data_(other.data_), size_(other.size_) { other.data_ = nullptr; // 元のポインタを無効化 other.size_ = 0; }
// ムーブ代入演算子 Buffer& operator=(Buffer&& other) noexcept { if (this != &other) { delete[] data_; data_ = other.data_; size_ = other.size_; other.data_ = nullptr; other.size_ = 0; } return *this; }} Tip: ムーブ後のオブジェクトは「有効だが未規定」状態。再利用前に明示的にリセット。
合格ライン
std::move の使い方を知っている
ムーブコンストラクタを書ける
参考リンク
演習課題
課題1: std::move
大きな文字列をムーブして関数に渡し、ムーブ後の状態を確認してください。
課題2: ムーブコンストラクタ
ムーブコンストラクタを持つクラスを作成してください。