所以我一直在讀SO和其他地方的std::move
,std::forward
,rvalues,左值等。但我發現我無法理解它。儘管我有時會進行修復,但我認爲在這之前我已經瞭解了有關C++的指針,引用等的基本知識。是我還是這些東西變得太重了?我是唯一一個發現std ::移動有點難以理解的人嗎?
回答
你的問題很一般。也許我可以讓你開始:
- 忽略的功能
std:move()
和std::forward()
之初方面的 - 一個右值引用是節省臨時工。
- 在C++代碼03,算上臨時工爲
Matrix z = a + b + c + d;
(與Matrix a,b,c,d;
) - 實現自己
operator+
上Matrix
與超載右值引用。 - 你應該能夠大大減少臨時數量。
- 在C++代碼03,算上臨時工爲
如果你想看到一個簡單的使用std::move()
:幫助編譯器,以避免引入副本返回值:
- 做一個容器類像
Image
- 昂貴的複製。 - 不要忘了執行移動和拷貝分配
發明了工廠功能的工作原理是這樣的:
Image load_matching_size(const char *fn_small, const char *fn_big) { pair<Image> ii = load_2_images(fn_small, fn_big); return ii.first.width() >= 64 ? ii.first : ii.second; }
你能指望的臨時的號碼?請注意0將需要額外的一個和複製! (該示例設計爲返回值優化(「RVO」)應該是不可能的)
- 您能否看到這不是必需的?函數返回後,
ii
中的圖像將被丟棄。那麼編譯器可以使用返回值嗎? (不,它不能。如果我們只有一個Image
,RVO會起作用)。 move
在return
你可以告訴編譯器,你不需要ii
進一步,它可以使用它作爲返回。並因此免去了昂貴的複製我使用move-c'tor而不是copy-c'tor作爲回報。
我會建議你閱讀的原始提案,如果您尚未:
A Proposal to Add Move Semantics Support to the C++ Language
它勾畫出的很清楚,可以用右值引用來解決的問題和移動的語義,以及如何右值引用和移動語義可以用來解決這些問題。
標準委員會的文件通常很密集且難以理解,但是這個文件很容易理解,非常值得一讀。右值引用和移動最終C++ 0x標準中指定的語義(無論何時發生)可能與本文提出的不同,但概念仍然相同。
不,我還沒有讀過,但是你所說的原因完全一樣。我發現官方文件太難篩選了。這就是爲什麼像這樣的網站如此之好。但是我會試一試:(。 – nakiya 2010-11-12 02:26:18
@nakiya:隨意回覆這裏有任何問題(或者如果你沒有發現那篇文章有幫助,請在評論中罵我)。這篇論文是技術性的,但是來自一個足夠高的水平,它是可讀的。 – 2010-11-12 02:29:53
- 1. 有人可以幫我理解這一點嗎?
- 2. 有人可以幫助我理解這一點嗎? INT *&PR
- 3. 有人可以解釋這一點嗎?
- 4. 我可以移動 - 將std :: map的內容分配到另一個std :: map嗎?
- 5. 有人可以給我一個這個功能的解釋嗎?
- 6. 有人可以向我解釋這一點嗎?
- 7. 難以理解一個數學公式
- 8. 你好,我是新來的python,我有困難有一個文件作爲輸入。有人可以幫我嗎?
- 9. 難道像15個難題一樣難以解決8個難題嗎
- 10. 有人可以指向我一個很容易理解的web.config指南嗎?
- 11. 移動控件存在一個問題,有人可以解釋爲什麼嗎?
- 12. 我可以在同一個表中有兩個唯一列嗎?
- 13. 有人可以爲我分解一個PIVOT查詢嗎?
- 14. 可以移動一個std :: map迭代通過它嗎?
- 15. 有人可以幫我理解這個例子的泛型嗎?
- 16. 任何人都可以幫助我理解這一點嗎? ------()? []:[]中的ObjectiveC
- 17. 是std :: array可移動嗎?
- 18. 有人可以解釋一下嗎?
- 19. 我難以理解scipy.optimize
- 20. 我們可以有一個非唯一索引PK嗎?
- 21. 任何人都可以發現爲什麼我有一個nullpointerexception?
- 22. 我有個人iOS開發人員帳戶,可以爲我的客戶發佈移動應用程序嗎?
- 23. 有人可以幫我理解XCode的工作原理嗎?
- 24. 有人可以幫我理解這個堆棧跟蹤嗎?
- 25. 有人可以幫我理解這個NoMethodError錯誤嗎?
- 26. 難以理解一些邏輯電路
- 27. Objective-C塊語法 - 有人可以解釋這一點嗎?
- 28. SQL Server ISDATE()函數 - 有人可以解釋這一點嗎?
- 29. 有人可以幫我理解這個「for」循環是如何工作的嗎?
- 30. 有人可以向我解釋這一行的Scala代碼嗎?
幸運的是,你已經有大約10年的時間去試圖在它們變得標準化之前瞭解它們。 – 2010-11-12 02:12:54
你無法準確把握什麼?當然,rvalues起初可能有點混亂,但其他的則非常簡單。當然,如果你願意,你可以直接使用指針和引用,但是它們可能被濫用和濫用,導致有時很難診斷的問題。標準庫旨在通過允許更多的編譯時驗證來幫助您編寫更安全,更正確的代碼,否則您可能無法進行編譯。 – 2010-11-12 02:13:58
@ Travis:不是。 C++ 0x應該在明年進行標準化,一些編譯器實現已經支持它們(即Visual C++和g ++,儘管其他人也可能已經支持它們)。 – 2010-11-12 02:18:24