簡體   English   中英

在c ++ 11中,虛函數可以通過移動語義有效地返回一個大值嗎?

[英]In c++11, can a virtual function return a large value efficiently with move semantics?

通常,這將被優化為不涉及復制大值(因為std::vector已啟用移動語義):

std::vector<int> makeABigThing(){
    std::vector<int> large_thing(1000, 0);
    return large_thing;
}

如果函數是虛方法,也可以以相同的方式優化:

struct Foo{
    virtual std::vector<int> makeABigThing(){
        std::vector<int> large_thing(1000, 0);
        return large_thing;
    }
};

即,即使在運行時選擇被調用函數,移動語義也能正常工作嗎?

函數是靜態還是動態解析不會影響移動結果的可能性。

與不相比, virtual不會改變任何東西。 編譯器仍然知道編譯時的返回類型。 實際上這(幾乎*)保證使用向量的移動語義。

*它可以通過NRVO完全消除它

此優化稱為copy elision(http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/),它優先於c ++ 11。 移動語義和復制省略都是相同類型的解決方案,兩者都是標准的一部分,但復制省略由編譯器實現,而移動語義則由程序員控制此優化。

行為應該是相同的,虛擬的或不是。

暫無
暫無

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

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