簡體   English   中英

rvalue保證什么樣的優化?

[英]What kind of optimizations does rvalue guarantee?

我想用另一個使用rvalue構造一個對象。

class BigDataClass{
public:
    BigDataClass(); //some default BigData
    BigDataClass(BigDataClass&& anotherBigData);
private:
    BigDataClass(BigDataClass& anotherBigData);

    BigDataPtr m_data;
};

所以現在我想做一些事情:

BigDataClass someData;
BigDataClass anotherData(std::move(someData));

所以現在anotherData獲得了rValue。 事實上,這是一個eXpiring Value,因此http://en.cppreference.com/w/cpp/utility/move狀態編譯器現在有機會通過將someData移動到另一個來優化anotherData的初始化。

在我看來,我們實際上可以得到兩件不同的東西:

  1. 優化方法:數據移動。 它經過優化,快速,我們很高興
  2. 非優化方法:數據未移動。 我們必須將數據從對象復制到另一個並從第一個數據中刪除數據(據我所知,一旦我們無法使用它,將對象更改為rvalue,因為它沒有數據的所有權,它持有)。 事實上,由於刪除操作,它可能比使用左值參考的初始化更慢。

我們真的可以獲得如此未經優化的數據初始化方式嗎?

你說:

所以現在anotherData獲得了rValue。 事實上它是一個eXpiring Value,因此http://en.cppreference.com/w/cpp/utility/move狀態編譯器現在有機會通過將someData移動到另一個來優化anotherData的初始化。

實際上,它所說的是:

接收這樣的xvalue的代碼有機會通過將數據移出參數來優化掉不必要的開銷,使其處於有效但未指定的狀態。

也就是說,這是負責優化的代碼,而不是編譯器。 所有std::move(someData)都將其參數std::move(someData)轉換為右值引用。 假設BigDataClass有一個帶rvalue引用的構造函數,那么該構造函數是首選,並且該構造函數是被調用的構造函數。 從編譯器的角度來看,這里沒有任何改變的余地。 因此代碼將執行BigDataClass(BigDataClass&&)構造函數所做的任何事情。

看起來你很困惑什么是優化,什么不是。 使用移動構造函數(如果可用)不是優化,它是由標准強制執行的。 這不是編譯器有這個機會,它必須這樣做。 另一方面,復制省略是編譯器有機會執行的優化。 它是如何重新定位的,取決於你的編譯器(盡管它們非常均勻地應用它)和實際的功能代碼。

您考慮優化器可以使用移動語義做什么。 什么都不是! 作為編碼器,您必須實現與構造函數與const ref進行比較的優化代碼。

問題可能恰恰相反:如果編譯器已經知道你有一個rvalue作為const ref傳遞給構造函數,那么編譯器就可以進行構造,就像在構造函數本身中生成值一樣。 復制刪除通常由最新的編譯器完成。 這里的問題是(對我來說)我應該花多少努力來編寫一些右值參考結構來獲得與編譯器已經為我建立的相同結果。

好的,在c ++ 11中,您有很多機會處理代碼以便通過算法進行轉發和移動。 是的,可以產生一些好處。 但我看到只有模板化代碼的好處,我需要將一些參數移動/轉發到(元)模板函數。

而恰恰相反:必須小心處理右值引用,並且有效但未定義狀態的含義會對使用接口實現的每個用戶產生一些問題。 另請參閱: 移動對象可以執行哪些操作?

rvalue保證什么樣的優化

什么都沒有。 你必須實現它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM