std move 怎麼用?用or不用?

2021-10-09 02:42:33 字數 529 閱讀 2728

在隆冬,我終於知道,我身上有乙個不可戰勝的夏天。 ——阿爾貝·加繆

今天提交了一次**,短短一百多行裡,被各位commiter提了18個問題,其中三次提到函式返回值使用std::move()。返回值是乙個物件時,使用std::move()就會呼叫移動建構函式,將形參的物件移動至呼叫函式以賦值的物件。

其實說白了都是考慮記憶體開銷以及效能。

但是又看到很多地方講到,在很多簡單場景下,編譯器其實是會做掉這個優化,編譯器如果發現你函式的返回值是初始化乙個新的物件例項,那麼就會在新的物件示例的位址原地宣告形參的物件,這樣在函式返回時無需移動或拷貝操作。不過當**邏輯比較複雜,使得編譯器無法發現時,則不會做。

這時候就會出現乙個問題,如果程式設計師編碼時顯式地使用了std::move()函式來返回,編譯器則不會做此項優化,這樣反而會造成額外開銷。

這裡可能也算是一處體現c++易學難精的例子吧。

附一篇講的還蠻詳細的blog:c++ 函式返回區域性變數的std::move()的適用場景**)

ubuntu原來是用用apt 不用 rpm

rpm 一些查詢相關指令 來於 rpm格式是red hat package manager的簡稱,是由red hat公司推出的,在ubuntu上不能安裝.rpm格式的軟體包,一般用alien把rpm轉換為deb格式後再安裝。ubuntu沒有預設安裝 alien,所以先安裝alien,命令為 sudo...

malloc怎麼用 用C實現協程庫

協程這個東西有一段時間非常火熱,特別是go出來以後,大家都覺得這個使用者態執行緒技術解決了很多問題,甚至用它可以支撐8億使用者,於是大家紛紛寫了c c 的協程庫。實際上,我覺得協程庫和支撐多少使用者關係不大,甚至不用協程還可以支撐更多的使用者 減少了協程的開銷 協程只是提供一種程式設計模式,讓伺服器...

不用快取服務,還能怎麼快取資料?

除了常見的redis memcache等程序外快取服務,還能怎麼快取資料?快取還有一種常見的玩法,程序內快取。什麼是程序內快取?將一些資料快取在站點,或者服務的程序內,這就是程序內快取。程序內快取的實現載體,最簡單的,可以是乙個帶鎖的map。又或者,可以使用第三方庫,例如leveldb。程序內快取能...