所有種在C++標準庫類有一個成員交換功能,包括一些多態類等std::basic_ios<CharT>
。模板類別std::shared_future<T>
顯然是一個值類型,而std::future<T>
是一個只能移動的值類型。有沒有什麼特別的原因,他們不提供swap()
會員功能?爲什麼的std ::未來<T>和std :: shared_future <T>不能提供成員交換()?
4
A
回答
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 )。
因此它知道到lhs
和rhs
中間訪問永遠不會發生,因而tmp
存在可以消除作爲-如果一旦它證明tmp
是空的,並因此具有無操作析構函數。
Static single assignment,其中您將程序分解爲每個對基元的賦值創建一個全新變量(帶有元數據)。然後證明有關該變量的屬性,並刪除多餘的屬性。
相關問題
- 1. C++什麼是std :: shared_future和std :: promise
- 2. 爲什麼std :: weak_ptr <>不提供布爾轉換?
- 3. 爲什麼`std :: common_type_t <std :: ostream&,std :: ostream&>`等於`std :: ostream`而不是`std :: ostream&`?
- 4. 爲什麼不能在std :: string上重載「operator <<」?
- 5. 不能設置爲空的特性「TGT」
- 6. 將std :: vector <std :: pair <const K, V> *>轉換爲std :: vector <std :: pair <const K, V>>
- 7. setbase(8)和std :: cout << std :: oct
- 8. 不能綁定'std :: ostream {aka std :: basic_ostream <char>}'左值爲'std :: basic_ostream <char> &&'
- 9. 爲什麼std :: swap不能使用std :: bitset <n>的內容?
- 10. 將std :: function <void(Derived *)>轉換爲std :: function <void(Base*)>
- 11. std :: initializer_list <int const>不能從std :: initializer_list構建<int>
- 12. C++循環std :: vector <std :: map <std :: string,std :: string>>
- 13. 爲什麼`<< std :: endl`不能調用我想調用的操作符?
- 14. 爲什麼不能std :: tuple <int>可以複製?
- 15. C++:std :: shared_ptr <T>和std :: shared_ptr <T const>有什麼區別?
- 16. std :: to_string,boost :: to_string和boost :: lexical_cast <std::string>有什麼區別?
- 17. 錯誤:'operator *'不匹配(操作數類型爲'std :: vector <std :: complex <double>>'和'std :: complex <double>')
- 18. 由TGT創建iSCSI目標不能
- 19. iterate std :: vector <std :: vector <char>>?
- 20. std :: array <bool>的性能對比std :: vector <bool>
- 21. 什麼更好std :: lock_guard <std::mutex>鎖(std :: mutex mutex_var);或std :: mutex mutex_var.lock();
- 22. C++ std :: vector <std :: shared_ptr>
- 23. 重載運算符<<:不能綁定'std :: basic_ostream <char>'左值爲'std :: basic_ostream <char> &&'
- 24. C++。爲什麼std :: cout << char + int打印int值?
- 25. 部隊更新TGT
- 26. 樹莓派工具鏈上的std :: shared_future
- 27. 一個std :: shared_ptr <>的std :: tuple <>不起作用?
- 28. std :: sort on std :: vector <std::string>
- 29. print unordered_map <std :: string,std :: list <std::string>
- 30. 在std :: vector上使用std :: unique()<std :: unordered_set <T>>
爲什麼一個成員函數,而不是爲不合格'swap'友元函數? - 我的印象是gcc(4.8)在優化'unique_ptr'方面不好。雖然它使用SSE,但它執行了大量不必要的操作。也許是由於異常處理,但也許也因爲的libstdC++的'unique_ptr'使用'tuple'實現壓縮對缺失者和指針,以及元組可能是十分困難的優化。 – dyp
@dyp聽起來是讓優化器更好的原因,而不是改變語言。或者找出一種表達壓縮元組習慣的方法,而不是一個難以優化的基於庫的'tuple';如果壓縮的'tuple'很難優化,可能有內建的'std :: tuple'?這可能會走得很遠;那麼一個內置的原始產品類型可以簡化實現壓縮的'std :: tuple'? – Yakk
libC++有一個專用的'compressed_pair'類型,我認爲這已經有所幫助。至少在編譯時間。由於性能方面的原因,Howard Hinnant似乎不喜歡複製/移動+交換習慣用法,因此我對性能感到疑惑。 – dyp