今天轉換心情,來聊聊幾個常用的小功能。首先是,Range-Based for Loops。
std::vector<int> vi = {1, 2, 3, 4, 5};
for (int i = 0; i < vi.size(); ++i) {
printf("i = %d\n", vi[i]);
}
for (auto& i : vi) {
printf("i = %d\n", i);
}
Range-Based for Loops 的好處是可以避免存取超過容器大小的值。這是蠻常見的錯誤。
這才不是什麼「小功能」,這是 C++11 很重要的功能。
C++ 的強項是「效能」,使用 C++ 寫出來的程式在效能上比其他程式語言還要快。但是,好還要更好,Move Semantics 以及 Rvalue References 就是為了讓效能更上層樓的技術—藉由消除複製。
std::vector<TeaShopOwner> owners;
TeaShopOwner coco("COCO")
TeaShopOwner one_shit("1Shit")
vi.push_back(coco);
vi.push_back(one_shit);
C++11 之前,上述兩個 push_back
的操作會產生暫時物件,這就是浪費。如果 TeaShopOwner
的複製成本很高,那麼上述的程式碼效能就會受到影響。
據說,在一行程式碼都不改的情況下,改用 C++11 編譯重編同一個專案,因為 Move 減少了物件複製,使得效能獲得顯著的提昇。
如果真是這樣,那麼emplace_back()
不就沒用了?
那倒不是, emplace_back
也可用來消除不必要的複製,兩者並不衝突。