2010-11-12 24 views
5

所以我一直在讀SO和其他地方的std::move,std::forward,rvalues,左值等。但我發現我無法理解它。儘管我有時會進行修復,但我認爲在這之前我已經瞭解了有關C++的指針,引用等的基本知識。是我還是這些東西變得太重了?我是唯一一個發現std ::移動有點難以理解的人嗎?

+2

幸運的是,你已經有大約10年的時間去試圖在它們變得標準化之前瞭解它們。 – 2010-11-12 02:12:54

+0

你無法準確把握什麼?當然,rvalues起初可能有點混亂,但其他的則非常簡單。當然,如果你願意,你可以直接使用指針和引用,但是它們可能被濫用和濫用,導致有時很難診斷的問題。標準庫旨在通過允許更多的編譯時驗證來幫助您編寫更安全,更正確的代碼,否則您可能無法進行編譯。 – 2010-11-12 02:13:58

+4

@ Travis:不是。 C++ 0x應該在明年進行標準化,一些編譯器實現已經支持它們(即Visual C++和g ++,儘管其他人也可能已經支持它們)。 – 2010-11-12 02:18:24

回答

1

你的問題很一般。也許我可以讓你開始:

  • 忽略的功能std:move()std::forward()之初方面的
  • 一個右值引用是節省臨時工。
    • 在C++代碼03,算上臨時工爲Matrix z = a + b + c + d;(與Matrix a,b,c,d;
    • 實現自己operator+Matrix與超載右值引用
    • 你應該能夠大大減少臨時數量。

如果你想看到一個簡單的使用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會起作用)。
  • movereturn你可以告訴編譯器,你不需要ii進一步,它可以使用它作爲返回。並因此免去了昂貴的複製我使用move-c'tor而不是copy-c'tor作爲回報。
7

我會建議你閱讀的原始提案,如果您尚未:

A Proposal to Add Move Semantics Support to the C++ Language

它勾畫出的很清楚,可以用右值引用來解決的問題和移動的語義,以及如何右值引用和移動語義可以用來解決這些問題。

標準委員會的文件通常很密集且難以理解,但是這個文件很容易理解,非常值得一讀。右值引用和移動最終C++ 0x標準中指定的語義(無論何時發生)可能與本文提出的不同,但概念仍然相同。

+0

不,我還沒有讀過,但是你所說的原因完全一樣。我發現官方文件太難篩選了。這就是爲什麼像這樣的網站如此之好。但是我會試一試:(。 – nakiya 2010-11-12 02:26:18

+0

@nakiya:隨意回覆這裏有任何問題(或者如果你沒有發現那篇文章有幫助,請在評論中罵我)。這篇論文是技術性的,但是來自一個足夠高的水平,它是可讀的。 – 2010-11-12 02:29:53

相關問題