ムーブセマンティクス: 効率的な所有権移動

C++11の革命。コピー不要の高速転送。

ムーブ
リソースの所有権を移動。コピーより高速。
右辺値参照
&& で表す。一時オブジェクトをバインド。
noexcept
ムーブ操作は例外を投げないことを保証。

ムーブとは?

引っ越し

全てコピーするのではなく、住所だけ渡して「この家はあなたのもの」と言う。

Basic Move
#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); // 所有権を移動
}

クラスでの実装

Move Constructor & Assignment
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: ムーブコンストラクタ
ムーブコンストラクタを持つクラスを作成してください。

次のステップ