c 右值引用,左值引用與move

2021-10-12 19:14:31 字數 1648 閱讀 9320

參考一篇不錯的博文

核心思想:

臨時物件被使用完之後會被立即析構,在析構函式中free掉申請的記憶體資源。

如果能夠直接使用臨時物件已經申請的資源,並在其析構函式中取消對資源的釋放,這樣既能節省資源,又能節省資源申請和釋放的時間。 這正是定義移動語義的目的。

簡單來說,類的建構函式、使用左值引用的建構函式、operator=過載函式等,會申請新的記憶體,複製資料;而使用右值引用的這些函式中,則直接使用原有的記憶體,並保證原有記憶體不被釋放,這樣就節省了一部分時間,提高了swap等函式的效率。

在使用自定義類時,使用者可以根據需求選擇左值引用還是右值引用,而選擇右值引用帶來的效能提公升則取決於類函式的寫法了。例如,使用vector的左值引用與右值引用幾乎沒有差別,而下面的例子使用右引則快了很多。

std::move函式就是將左引轉換為右引。

上**:

#include

#include

using

namespace std;

class

mystring

mystring

(const

char

* s)

mystring

(const mystring& str)

mystring

(mystring&& str)

mystring&

operator=(

const mystring& str)

cout <<

"等號操作符過載"

<< str.m_data << endl;

return

*this;}

mystring&

operator

=(mystring&& str)

return

*this;}

~mystring()

}private

:void

init_data

(const

char

* s)

char

* m_data;

size_t m_len;};

namespace myt

template

<

class

t>

void

swap

(t& a, t& b)

}void

test()

clock_t t1 =

clock()

;for

(int i =

0; i < n; i++

) cout << t1 - t0 << endl;

cout <<

clock()

- t1 << endl;

}int

main()

執行結果:

可以看到使用右引的swap函式要比使用左引快了1/6。這是由於使用左引的建構函式、operator=函式中呼叫了init_data(),進行了字串的拷貝,而右引時省去了這一操作。

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...

C 左值 右值 左值引用 右值引用

就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...