C++ move()函數(shù)案例詳解
要了解move函數(shù)首先弄清左值引用和右值引用。
左值、左值引用、右值、右值引用
1、左值和右值的概念
左值是可以放在賦值號(hào)左邊可以被賦值的值;左值必須要在內(nèi)存中有實(shí)體;
右值當(dāng)在賦值號(hào)右邊取出值賦給其他變量的值;右值可以在內(nèi)存也可以在CPU寄存器。
一個(gè)對(duì)象被用作右值時(shí),使用的是它的內(nèi)容(值),被當(dāng)作左值時(shí),使用的是它的地址。
2、引用
引用是C++語法做的優(yōu)化,引用的本質(zhì)還是靠指針來實(shí)現(xiàn)的。引用相當(dāng)于變量的別名。
引用可以改變指針的指向,還可以改變指針?biāo)赶虻闹怠?/p>
引用的基本規(guī)則:
- 聲明引用的時(shí)候必須初始化,且一旦綁定,不可把引用綁定到其他對(duì)象;即引用必須初始化,不能對(duì)引用重定義;
- 對(duì)引用的一切操作,就相當(dāng)于對(duì)原對(duì)象的操作。
3、左值引用和右值引用
3.1 左值引用
左值引用的基本語法:type &引用名 = 左值表達(dá)式;
3.2 右值引用
右值引用的基本語法type &&引用名 = 右值表達(dá)式;
右值引用在企業(yè)開發(fā)人員在代碼優(yōu)化方面會(huì)經(jīng)常用到。
右值引用的“&&”中間不可以有空格。
- std::move并不能移動(dòng)任何東西,它唯一的功能是將一個(gè)左值強(qiáng)制轉(zhuǎn)化為右值引用,繼而可以通過右值引用使用該值,以用于移動(dòng)語義。從實(shí)現(xiàn)上講,std::move基本等同于一個(gè)類型轉(zhuǎn)換:static_cast<T&&>(lvalue);
- C++ 標(biāo)準(zhǔn)庫(kù)使用比如vector::push_back 等這類函數(shù)時(shí),會(huì)對(duì)參數(shù)的對(duì)象進(jìn)行復(fù)制,連數(shù)據(jù)也會(huì)復(fù)制.這就會(huì)造成對(duì)象內(nèi)存的額外創(chuàng)建, 本來原意是想把參數(shù)push_back進(jìn)去就行了,通過std::move,可以避免不必要的拷貝操作。
- std::move是為性能而生。
- std::move是將對(duì)象的狀態(tài)或者所有權(quán)從一個(gè)對(duì)象轉(zhuǎn)移到另一個(gè)對(duì)象,只是轉(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)用移動(dòng)構(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測(cè)試問題
- C++中CopyFile和MoveFile函數(shù)使用區(qū)別的示例分析
- C++11中value category(值類別)及move semantics(移動(dòng)語義)的介紹
- C++中的移動(dòng)構(gòu)造函數(shù)及move語句示例詳解
- C++11右值引用和std::move語句實(shí)例解析(推薦)
- C++中memcpy和memmove的區(qū)別總結(jié)
- 基于C++ list中erase與remove函數(shù)的使用詳解
- C++ CopyFile,MoveFile用法案例詳解
相關(guān)文章
C#桌面應(yīng)用開發(fā)實(shí)現(xiàn)番茄定時(shí)器
本文主要介紹了C#桌面應(yīng)用開發(fā)實(shí)現(xiàn)番茄定時(shí)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
C語言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn)
這篇文章主要介紹了C語言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn),包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下2015-11-11
c語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例
下面小編就為大家?guī)硪黄猚語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09

