[英]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.