iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0

今天轉換心情,來聊聊幾個常用的小功能。首先是,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 的好處是可以避免存取超過容器大小的值。這是蠻常見的錯誤。

Move Semantics and Rvalue References

這才不是什麼「小功能」,這是 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 減少了物件複製,使得效能獲得顯著的提昇。


上一篇
DAY 14:Lambda,卷四:好東西也要用得恰到好處
下一篇
DAY 16:Structured Bindings
系列文
山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
alantsui
iT邦新手 5 級 ‧ 2019-09-18 13:46:17

如果真是這樣,那麼emplace_back()不就沒用了?

那倒不是, emplace_back 也可用來消除不必要的複製,兩者並不衝突。

我要留言

立即登入留言