C++11 引入了移動(dòng)語(yǔ)義(move semantics),它通過(guò)右值引用、std::move
函數(shù)和 std::forward
函數(shù)等特性來(lái)提高性能和資源利用率
使用 C++11 右值引用:
在類定義中,為需要支持移動(dòng)語(yǔ)義的成員函數(shù)添加右值引用參數(shù)。例如:
class MyClass {
public:
MyClass(MyClass&& other) noexcept {
// 移動(dòng)構(gòu)造函數(shù)的實(shí)現(xiàn)
}
};
使用 std::move
函數(shù):
當(dāng)需要將左值轉(zhuǎn)換為右值時(shí),可以使用 std::move
函數(shù)。例如:
MyClass obj1;
MyClass obj2 = std::move(obj1); // 將 obj1 轉(zhuǎn)換為右值并初始化 obj2
使用 std::forward
函數(shù):
當(dāng)需要將參數(shù)傳遞給其他函數(shù)時(shí),使用 std::forward
函數(shù)可以保持參數(shù)的原始值類別(左值或右值)。例如:
template <typename T>
void wrapper(T&& arg) {
myFunction(std::forward<T>(arg));
}
在適當(dāng)?shù)臅r(shí)候使用 std::unique_ptr
和 std::shared_ptr
:
使用智能指針(如 std::unique_ptr
和 std::shared_ptr
)可以自動(dòng)管理資源,避免內(nèi)存泄漏。這些智能指針在移動(dòng)時(shí)會(huì)自動(dòng)轉(zhuǎn)移所有權(quán),從而支持移動(dòng)語(yǔ)義。
在類中使用 noexcept
關(guān)鍵字:
在移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符中使用 noexcept
關(guān)鍵字可以提高性能,因?yàn)榫幾g器會(huì)嘗試內(nèi)聯(lián)這些函數(shù)。例如:
class MyClass {
public:
MyClass(MyClass&& other) noexcept {
// 移動(dòng)構(gòu)造函數(shù)的實(shí)現(xiàn)
}
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) {
// 移動(dòng)賦值運(yùn)算符的實(shí)現(xiàn)
}
return *this;
}
};
在類中使用 = default
語(yǔ)法:
當(dāng)需要為類生成默認(rèn)的移動(dòng)構(gòu)造函數(shù)、移動(dòng)賦值運(yùn)算符等時(shí),可以使用 = default
語(yǔ)法。例如:
class MyClass {
public:
MyClass(MyClass&&) = default; // 使用默認(rèn)的移動(dòng)構(gòu)造函數(shù)
MyClass& operator=(MyClass&&) = default; // 使用默認(rèn)的移動(dòng)賦值運(yùn)算符
};
通過(guò)以上方法,可以在保留舊代碼的基礎(chǔ)上引入移動(dòng)語(yǔ)義,從而提高程序的性能和資源利用率。