C++ move()函數(shù)案例詳解
要了解move函數(shù)首先弄清左值引用和右值引用。
左值、左值引用、右值、右值引用
1、左值和右值的概念
左值是可以放在賦值號左邊可以被賦值的值;左值必須要在內(nèi)存中有實體;
右值當(dāng)在賦值號右邊取出值賦給其他變量的值;右值可以在內(nèi)存也可以在CPU寄存器。
一個對象被用作右值時,使用的是它的內(nèi)容(值),被當(dāng)作左值時,使用的是它的地址。
2、引用
引用是C++語法做的優(yōu)化,引用的本質(zhì)還是靠指針來實現(xiàn)的。引用相當(dāng)于變量的別名。
引用可以改變指針的指向,還可以改變指針?biāo)赶虻闹怠?/p>
引用的基本規(guī)則:
- 聲明引用的時候必須初始化,且一旦綁定,不可把引用綁定到其他對象;即引用必須初始化,不能對引用重定義;
- 對引用的一切操作,就相當(dāng)于對原對象的操作。
3、左值引用和右值引用
3.1 左值引用
左值引用的基本語法:type &引用名 = 左值表達(dá)式;
3.2 右值引用
右值引用的基本語法type &&引用名 = 右值表達(dá)式;
右值引用在企業(yè)開發(fā)人員在代碼優(yōu)化方面會經(jīng)常用到。
右值引用的“&&”中間不可以有空格。
- std::move并不能移動任何東西,它唯一的功能是將一個左值強(qiáng)制轉(zhuǎn)化為右值引用,繼而可以通過右值引用使用該值,以用于移動語義。從實現(xiàn)上講,std::move基本等同于一個類型轉(zhuǎn)換:static_cast<T&&>(lvalue);
- C++ 標(biāo)準(zhǔn)庫使用比如vector::push_back 等這類函數(shù)時,會對參數(shù)的對象進(jìn)行復(fù)制,連數(shù)據(jù)也會復(fù)制.這就會造成對象內(nèi)存的額外創(chuàng)建, 本來原意是想把參數(shù)push_back進(jìn)去就行了,通過std::move,可以避免不必要的拷貝操作。
- std::move是為性能而生。
- std::move是將對象的狀態(tài)或者所有權(quán)從一個對象轉(zhuǎn)移到另一個對象,只是轉(zhuǎn)移,沒有內(nèi)存的搬遷或者內(nèi)存拷貝。
用法:
原lvalue值被moved from之后值被轉(zhuǎn)移,所以為空字符串.
#include <iostream> #include <utility> #include <vector> #include <string> int main() { std::string str = "Hello"; std::vector<std::string> v; //調(diào)用常規(guī)的拷貝構(gòu)造函數(shù),新建字符數(shù)組,拷貝數(shù)據(jù) v.push_back(str); std::cout << "After copy, str is \"" << str << "\"\n"; //調(diào)用移動構(gòu)造函數(shù),掏空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"
到此這篇關(guān)于C++ move()函數(shù)案例詳解的文章就介紹到這了,更多相關(guān)C++ move()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++11中std::move、std::forward、左右值引用、移動構(gòu)造函數(shù)的測試問題
- C++中CopyFile和MoveFile函數(shù)使用區(qū)別的示例分析
- C++11中value category(值類別)及move semantics(移動語義)的介紹
- C++中的移動構(gòu)造函數(shù)及move語句示例詳解
- C++11右值引用和std::move語句實例解析(推薦)
- C++中memcpy和memmove的區(qū)別總結(jié)
- 基于C++ list中erase與remove函數(shù)的使用詳解
- C++ CopyFile,MoveFile用法案例詳解
相關(guān)文章
C++?opencv圖像處理實現(xiàn)圖片邊緣檢測示例
這篇文章主要為大家介紹了C++?opencv實現(xiàn)圖片邊緣檢測示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Qt實現(xiàn)帶字?jǐn)?shù)限制的文字輸入框
這篇文章介紹了Qt實現(xiàn)帶字?jǐn)?shù)限制文字輸入框的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04關(guān)于雙向鏈表的增刪改查和排序的C++實現(xiàn)
下面小編就為大家?guī)硪黄P(guān)于雙向鏈表的增刪改查和排序的C++實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12C++利用MySQL API連接和操作數(shù)據(jù)庫實例詳解
這篇文章主要介紹了C++利用MySQL API連接和操作數(shù)據(jù)庫實例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01如何在C++中通過模板去除強(qiáng)制轉(zhuǎn)換
本文講解的是如何在C++中通過模板去除強(qiáng)制轉(zhuǎn)換,在編程工作中應(yīng)盡量少使用強(qiáng)制類型轉(zhuǎn)換,模板有助于我們實現(xiàn)這一目的,需要的朋友可以參考下2015-07-07