新特性(3) move語義

2021-08-30 04:43:52 字數 1790 閱讀 6222

在說move語義之前,不得不說的是左值和右值。

通俗簡單點的講左值和右值通過是否在記憶體中有空間來分類。左值是在記憶體空間實體如(變數和函式等),而相反的沒有空間的為右值如臨時物件。

int a=1;

//a為左值,1為右值

int*p =

&a;//p為左值

int f =

test()

;//test()返回乙個臨時物件,為右值

再比如這樣,test()返回乙個全域性變數是乙個左值

int t;

int&

test()

test()

=5;

顧名思義,左值引用又分為常量左值引用和非常量左值引用,區別 在於使用了const是否能改變。

int b;

int&a=b;

//常量左值引用

const

int&c=b;

//非常量左值引用

非常量左值引用只能引用非常量左值,如

int a;

//非常量左值

const

int b;

//常量左值

int&c=a//ok,引用非常量左值

int&c=b;

//error,引用常量左值,造成了常量變為可修改

int&c=

123//error,引用右值,表示式結束臨時物件已銷毀。

常量左值引用可以引用所有左值和右值

const

int&c=a;..

....

.

當然左值引用是有一定侷限的,如常量左值引用的右值永遠只能是常量。如果我們想獲得非常量右值該怎麼辦呢。這時候c++11增加了新的引用型別 t&& t,來進行右值引用。

右值引用也分為常量右值引用和非常量右值引用,右值引用都不能用來引用左值。常量右值引用可以引用常量右值和非常量右值。而非常量右值引用只能引用非常量右值。

const

int&& a =

123;

在說move語義隻前先介紹下什麼叫語義

語法 = 某個源**怎麼寫

語義 = 這個源**怎麼執行

什麼意思呢,就如汎型和正常**的區別,泛型程式設計只會告訴你這個源**怎麼執行,在你確定型別後才是某個源**怎麼寫。

在變數中經常用到賦值語義,賦值語義會先拷貝出乙個臨時變數,再將臨時變數拷貝給左邊的變數。在函式返回值中也是先產生臨時變數再拷貝,這樣每次賦值都會產生一次臨時變數,當賦值複雜,如字串,容器等將產生許多臨時變數,降低效率。

如下,是賦值語義的兩個語法:

int b=a[1]

;int b=

*(a+1)

;

所以為解決產生多餘臨時變數的問題,c++11中就出現了move語義,move語義就是把舊指標的值複製到新指標,並把舊指標的值賦為null。如果我們能確定某個值是乙個非常量右值,則我們在進行臨時物件的拷貝時,可以不用拷貝實際的資料,而只是「竊取」指向實際資料的指標,並將臨時物件的生命週期提高,避免析構。(而我們之前提到的右值引用就是move語義提供的語法支援)

std::move 會傳入乙個 t&&的值,不用進行拷貝,但move後的變數仍然有效,但狀態不明

string str1

;string str2

;str1=std:

:move

(str1)

;

C 中11的新特性move與右值

什麼是左值什麼是右值 左值 指表示式結束後依然存在的持久化物件 右值 指表示式結束後就不在存在的臨時物件右值引用 繫結到右值的引用,用 來獲得右值的引用,右值引用只能繫結到要銷毀的物件,為了與右值引用區別開,常規的引用叫做左值引用 int var 12 int var1 var int var2 v...

Hadoop YARN的3新特性

在apache hadoop 2.4或者cdh5.0.0版本之後,增加了resourcemanger ha特性,支援基於zookeeper的熱主備切換,具體配置引數可以參考cloudera的文件 resourcemanager ha配置。2.磁碟容錯 在apache hadoop 2.4或者cdh5...

CSS3有哪些新特性?CSS3新特性詳解

本篇文章給大家帶來的內容是關於css3有哪些新特性?css3新特性詳解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。新增選擇器 p nth child n 彈性盒模型 display flex 多列布局 column count 5 查詢 media max width 480px...