C++ move()函數案例詳解
要了解move函數首先弄清左值引用和右值引用。
左值、左值引用、右值、右值引用
1、左值和右值的概念
左值是可以放在賦值號左邊可以被賦值的值;左值必須要在內存中有實體;
右值當在賦值號右邊取出值賦給其他變量的值;右值可以在內存也可以在CPU寄存器。
一個對象被用作右值時,使用的是它的內容(值),被當作左值時,使用的是它的地址。
2、引用
引用是C++語法做的優(yōu)化,引用的本質還是靠指針來實現(xiàn)的。引用相當于變量的別名。
引用可以改變指針的指向,還可以改變指針所指向的值。
引用的基本規(guī)則:
- 聲明引用的時候必須初始化,且一旦綁定,不可把引用綁定到其他對象;即引用必須初始化,不能對引用重定義;
- 對引用的一切操作,就相當于對原對象的操作。
3、左值引用和右值引用
3.1 左值引用
左值引用的基本語法:type &引用名 = 左值表達式;
3.2 右值引用
右值引用的基本語法type &&引用名 = 右值表達式;
右值引用在企業(yè)開發(fā)人員在代碼優(yōu)化方面會經常用到。
右值引用的“&&”中間不可以有空格。
- std::move并不能移動任何東西,它唯一的功能是將一個左值強制轉化為右值引用,繼而可以通過右值引用使用該值,以用于移動語義。從實現(xiàn)上講,std::move基本等同于一個類型轉換:static_cast<T&&>(lvalue);
- C++ 標準庫使用比如vector::push_back 等這類函數時,會對參數的對象進行復制,連數據也會復制.這就會造成對象內存的額外創(chuàng)建, 本來原意是想把參數push_back進去就行了,通過std::move,可以避免不必要的拷貝操作。
- std::move是為性能而生。
- std::move是將對象的狀態(tài)或者所有權從一個對象轉移到另一個對象,只是轉移,沒有內存的搬遷或者內存拷貝。
用法:
原lvalue值被moved from之后值被轉移,所以為空字符串.
#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
//調用常規(guī)的拷貝構造函數,新建字符數組,拷貝數據
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"\n";
//調用移動構造函數,掏空str,掏空后,最好不要使用str
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"\n";
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << v[1] << "\"\n";
}
輸出:
After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"
到此這篇關于C++ move()函數案例詳解的文章就介紹到這了,更多相關C++ move()函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

