參考一篇不錯的博文
核心思想:
臨時物件被使用完之後會被立即析構,在析構函式中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 中,乙個變數是左值還是...