移動語義帶來效能優化效果

2021-10-02 09:21:00 字數 2710 閱讀 8723

移動語義是c++11中的新特性,它的核心理念是所有權的轉移,而非傳統意義上的複製。許多c++11模板庫,例如string,vector都支援移動語義,都包含移動建構函式。移動語義通常和右值引用一同討論,下面語句中:

string s, s1, s2;

s = s1 + s2;

如果不考慮編譯器做的優化,在c++11之前,s1 + s2的結果會被儲存在乙個新建立的臨時string物件中,然後臨時物件的內容會取代s原來的內容,最後臨時物件和s原來的內容會被釋放。在整個過程中,臨時物件沒有名字,在語句結束之後會被銷毀。在c++11中,這個臨時物件就是乙個右值,std::move(s1 + s2)會建立乙個指向臨時物件內容的右值引用。移動語義這一特性,讓之前大量存在的臨時變數或臨時物件可以發揮更多的作用,從而達到效能優化的目的。

剛剛描述的case在c++11中並不是事實,編譯器針對s1 + s2這種語句已經做了優化,不需要顯示的std::move(s1 + s2)來轉換。剛剛的描述僅僅為了盡量簡單直觀的解釋移動語義和右值引用。

移動語義並不是什麼黑科技,但若想利用移動語義帶來的優化效果,很有必要細緻的學習相關知識。這篇部落格不會詳細介紹移動語義,這篇部落格用乙個簡單的例子直觀表達了移動語義可以帶來的優化效果。

#ifndef _common_h_

#define _common_h_

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#endif

#ifndef _timer_h

#define _timer_h

#include

#include

"common.h"

class

timer;~

timer()

else};

private

:timer()

; string _desc;

bool _us_used;

timeval _begin;

timeval _end;};

#endif

#include

"common.h"

#include

"timer.h"

const

int swaptimesint =

1024

;const

int stringlenint =

1024

;//普通swap函式

void

common_swap

(string &substring1, string &substring2)

//使用移動語義的swap函式

void

move_swap

(string &substring1, string &substring2)

intmain

(void);

snprintf

(stringelechar, stringlenint,

"%d"

, i)

; substring1 +

= stringelechar;

snprintf

(stringelechar, stringlenint,

"_%d"

, i)

; substring2 +

= stringelechar;

}printf

("size of substring1: %ld\n"

, substring1.

length()

);printf

("size of substring2: %ld\n"

, substring2.

length()

);}}

return0;

}

編譯

g++

-o swap_move swap_move.cpp -o0 -g -wall -std=c++

11

執行

[root@***

]# .

/swap_move

size of substring1:

2986

size of substring2:

4010

common swap, cost 67us

move swap, cost 24us

測試程式中,首先構造兩個string物件,然後用不同版本的swap函式分別進行1024次交換,最後列印時間。從時間結果來看,優化的效果很明顯,但通過更多測試可以發現,優化效果取決於字串的大小,也取決於編譯器的設計。

移動語義使用過程中要十分仔細,比如std::move(s)執行之後,s不可被繼續使用,s必須保證可以被析構。

移動語義是很新穎的特性,值得仔細學習,這篇部落格會不定期更新。

移動端效能優化?

盡量使用css3動畫,開啟硬體加速。適當使用touch事件代替click事件。避免使用css3漸變陰影效果。可以用transform translatez 0 來開啟硬體加速。不濫用float。float在渲染時計算量比較大,儘量減少使用 合理使用requestanimationframe動畫代替s...

《記憶體和效能優化》給我帶來的!

記憶體和效能優化 這本書教會了我很多!有很多的東西自己知道,但是確實想用語言表達出來很難,下面就簡單的發表我的一部分關於這本書的新的吧!我學會了在進行系統設計時要注意的問題 1 如何做需求分析 2 如何來檢測演算法的穩定性 3 如何優化自己的程式 4 如何在編寫程式時寫出高質量的 5 在程式除錯的過...

「無限載入更多」帶來的移動端效能瓶頸

相信很多前端都遇到過這樣的需求,在乙個頁面中預載入乙個列表資料,當瀏覽器滾動到底部之後載入更多資料,然後迴圈往復這個操作。不知道大家有沒有想過這個問題,裝置的記憶體是有限的,而作業系統分配給每乙個程式的記憶體資源也是有限制的,假如我們一直把這個列表載入下去,會出現什麼樣的問題?其實我發現這個載入更多...