2017-08-26 78 views
0

我想學習移動語義和我讀了一招可能比一個副本更快。不過,我看恰恰相反以下瑣碎代碼:爲什麼std :: string的拷貝構造函數看起來比它的移動對象更快?

for (int i = 0; i < 100000000; ++i) { 
    std::string a("Copy"); 
    std::string b = a; 
} 

for (int i = 0; i < 100000000; ++i) { 
    std::string a("Move"); 
    std::string b = std::move(a); 
} 

這裏是它發生在我的Mac時間:

$ time ./copy.out 
real 0m2.511s 
user 0m2.481s 
sys  0m0.011s 


$ time ./move.out 
real 0m3.993s 
user 0m3.933s 
sys  0m0.020s 
+7

是,對於基準整個代碼?編譯器標誌? –

+0

我認爲你的字符串太短以至於無法展示真正的差異。嘗試使用不同長度的字符串 –

+1

@VittorioRomeo,我使用鏗鏘與c + + 14和禁用優化(O0)。 – Zaxter

回答

0

作爲一個評論表明,大多數庫的實現做了「短字符串優化「,SSO,其中對於足夠短的字符串(對於給定的實現而言某個特定的長度),整個字符串被存儲在字符串對象的主體中,在堆棧上。當您的數據完全存儲在堆棧中時,移動與複製相同。我所知道的所有實現都將SSO爲4個字符的字符串,因此無論您移動還是複製它都是相同的操作。

如果輸出的sizeof(sring)的結果,選擇一個字符串比更大,並使用相同字符串兩種情況。同時確保優化。

這種方法來微基準測試是沒有那麼大。一般來說,隨機化時序區域外的數據通常會更好,然後在定時的循環中執行操作。使用相同的常量數據通常會導致瘋狂的編譯器優化,導致結果無效。