您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++11的swap怎么使用”,在日常操作中,相信很多人在C++11的swap怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++11的swap怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
假設有下面的數據類:
struct TestData{
TestData(int _size)
:size(_size)
{
data= new int[size];
}
~TestData(){
if(data != nullptr){
delete data;
}
}
TestData(const TestData& d)
{
size = d.size;
if(data != nullptr){
delete data;
}
data = new int[size];
memcpy(data, d.data, size * sizeof(int));
}
TestData& operator=(const TestData& d)
{
size = d.size;
if(data != nullptr){
delete data;
}
data = new int[size];
memcpy(data, d.data, size * sizeof(int));
return *this;
}
int size = 0;
int* data = nullptr;
};
這時一個簡單的數據類,定義了一個拷貝構造函數和一個賦值運算符。它們都實現了深拷貝。
C++11之前的swap
先看swap的實現:
template<classT>voidswap ( T& a, T& b ) { T c(a); a=b; b=c; }
下面結合示例下面的代碼看看發生了什么。
當swap調用了T C(a)的時候,實際上是調用了拷貝構造函數,當swap代碼調用了賦值操作時,實際上是調用了賦值運算符。
由于拷貝構造函數和賦值運算符包含內存拷貝操作,而這樣的操作共執行了三次,所以在一個swap中一共存在三次內存拷貝的操作。這種不必要的內存操作很多情況下都會影響C++的執行效率。
C++11之后的swap
引入了右值引用和數據移動的概念之后,代碼變成下面的樣子:
template<classT>voidswap (T& a, T& b) { T c(std::move(a)); a=std::move(b); b=std::move(c); }
由于std::move將變量類型轉換為右值引用,TestData有機會提供下面針對右值引用的構造函數和賦值運算符。
TestData(TestData&& d)
:size(d.size)
,data(d.data)
{
d.size = 0;
d.data = nullptr;
}
TestData& operator=(const TestData&& d)
{
size = d.size;
data = d.data;
return *this;
}
到此,關于“C++11的swap怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。