不知道啥是std::move()
的同學請簡單做一下課前預習。
先從乙個我們非常熟悉的情形入手,我們需要寫乙個student
類,傳入引數為std::string
,任何一名上課認真聽講的學生都會想到傳const&
。
class
student
private
: std::string _name;
};
讓我們拋開c++11
後引入的lvalue
rvalue
等繁瑣的概念,僅僅從兩個例子入手分析一下這種實現方式的開銷:
在情景2中,一行這樣的**竟然需要拷貝兩次字串,這真是非常地糟糕,對效能追求有強迫症的程式設計師會給student
類新增乙個student(const char* )
型別的建構函式以減少拷貝次數,但是事實上,c++11
為我們提供了std::move
用於解決此類問題,我們可以修改建構函式為:
class
student
private
: std::string _name;
};
再次分析一下情景2:
構造引數string name
,呼叫建構函式string(const char*)
呼叫std::move(name)
將name
轉換成右值。
呼叫string(string&&)
構造。
在這個方法下,一共僅發生了一次拷貝,儘管std::move
也有一定的開銷,但是相比於乙個容器類的拷貝來說還是微不足道的。
上面僅僅是舉了乙個非常簡單的例子分析建構函式這樣寫的好處,本質上,這種寫法的好處體現在建構函式接受的引數存在移動建構函式的情形下,比如上面情景2的高效關鍵在於呼叫了string(string&&)
建構函式。
下面我們做一組實驗來證明一下上面的結論並給出實踐的例子。
article
類如下:
class
article
private
: text _text;
};
text
類沒有定義移動建構函式。class
text
text
(const text &text)
};
執行以下**:article article
("c++ is the best language."
);
輸出:拷貝一次1
拷貝一次2
text
類定義移動建構函式。
class
text
text
(const text &text)
text
(text &&text)
};
執行以下**:article article
("c++ is the best language."
);
輸出:拷貝一次1
移動一次
驗證了我們的想法。
再往遠點講,std::move
很好用,但是它並不是乙個強制性的東西,編譯器不能避免程式設計師做出在move
了之後繼續訪問原物件等種種奇葩行為。有乙個語言很好地發展了現代c++的這個優點,從語法層面提供了移動語義。這個語言叫rust
。
但是c/c++
依然是最好的語言。
如何高效地做設計評審
設計評審 design review 即在真正開始開發之前,組織一次或多次會議,先評審設計,以降低日後返工甚至專案失敗的風險。相信工作過一段時間,開始主導乙個功能模組甚至整個系統的同學,都對設計評審不會陌生。今天偶然看到了一篇亞馬遜vp及distinguished工程師brad porter的一篇部...
C 如何過載建構函式
如果在c 中例項化類時我們沒有人為的使用建構函式,編譯器會自動將建構函式空實現 呼叫建構函式但函式體內為空 建構函式的作用是初始化類,當乙個類被例項化時,首先被執行的就是建構函式。建構函式有三種型別 class point class point point int a,int b a a a b ...
如何在C 中高效地搜尋泛型集合
例如,假設我們有兩個記憶體集合,乙個集合包含city 模型,另乙個集合包含restaurant 模型。我們的系統需要按city 組織 restaurant 這是我們的模型,其中restaurant的cityid屬性用於標識其居住的city 1 public class city24 public s...