2016-11-10 64 views

回答

4

會員交換是之前在C++ 11 std::move支持大規模的性能提升。例如,您可以將一個載體移動到另一個位置。它也用於vector調整大小,這意味着插入矢量媒體並不是完全表現自殺。

std::move後到達C++ 11,與許多有時空類型的std::swap默認實現:

template<class T> 
void swap(T& lhs, T& rhs) { 
    auto tmp = std::move(rhs); 
    rhs = std::move(lhs); 
    lhs = std::move(tmp); 
} 

將是基本上一樣快,自定義編寫的一個。

現有各類與swap成員都不會失去他們(至少立即)。但是,擴展新類型的API應該是合理的。

如果std::future基本上是一個圍繞std::unique_ptr<future_impl>的包裝,那麼上述需要4個指針讀取,3個指針寫入和一個分支。並且一個優化編譯器將其內聯到一個優化的.swap成員函數可以將其降低到2個指針讀取和2個指針寫入(例如使用SSA )。


因此它知道到lhsrhs中間訪問永遠不會發生,因而tmp存在可以消除作爲-如果一旦它證明tmp是空的,並因此具有無操作析構函數。

Static single assignment,其中您將程序分解爲每個對基元的賦值創建一個全新變量(帶有元數據)。然後證明有關該變量的屬性,並刪除多餘的屬性。

+0

爲什麼一個成員函數,而不是爲不合格'swap'友元函數? - 我的印象是gcc(4.8)在優化'unique_ptr'方面不好。雖然它使用SSE,但它執行了大量不必要的操作。也許是由於異常處理,但也許也因爲的libstdC++的'unique_ptr'使用'tuple'實現壓縮對缺失者和指針,以及元組可能是十分困難的優化。 – dyp

+0

@dyp聽起來是讓優化器更好的原因,而不是改變語言。或者找出一種表達壓縮元組習慣的方法,而不是一個難以優化的基於庫的'tuple';如果壓縮的'tuple'很難優化,可能有內建的'std :: tuple'?這可能會走得很遠;那麼一個內置的原始產品類型可以簡化實現壓縮的'std :: tuple'? – Yakk

+0

libC++有一個專用的'compressed_pa​​ir'類型,我認爲這已經有所幫助。至少在編譯時間。由於性能方面的原因,Howard Hinnant似乎不喜歡複製/移動+交換習慣用法,因此我對性能感到疑惑。 – dyp

相關問題