2015-05-06 51 views
3

我已經編寫了按值返回巨大對象的函數。我的同事抱怨說,它會做冗餘副本,並建議通過引用作爲函數參數返回對象。我知道返回值優化將被完成,副本將被刪除,但代碼將被用於可由不同編譯器編譯的庫中,並且我無法測試所有這些代碼。爲了讓我的同事相信,通過價值回報對象是一種保存,我需要一些說明它的文檔。我如何確定將完成返回值優化

我已經看過C++ 03標準,但找不到任何關於返回值優化的內容。你能否給出鏈接到一個文件(標準),在哪裏定義RVO將完成。或者如果它不存在,我可以找到支持RVO的編譯器列表?

+2

它不能保證。 – NathanOliver

+0

我想你永遠無法確定何時完成優化,因爲這是一個非常特殊的編譯器。 – RedX

+0

我會說任何體面的編譯器應該使用RVO,如果它不,那麼你不應該使用它。 – NathanOliver

回答

2

該標準不會保證RVO的發生,它只是允許它。

您可以查看產生的實際代碼以確定它是否發生,但這仍然不能保證它將來仍會發生。儘管如此,每個像樣的編譯器都可以在很多情況下執行RVO,即使沒有RVO發生,C++ 11(及更高版本)的移動構建也可以使返回相對便宜。

+0

這個問題涉及C++ 03,所以沒有移動語義。 – hvd

1

您可以用來向同事證明RVO正在完成的一種方法是在代碼中放置printfs或其他類似的語句。

HugeObject& HugeObject::operator=(const HugeObject& rhs) 
{ 
    printf("HugeObject::operator= called\n"); 
} 

HugeObject::HugeObject(const HugeObject& rhs) 
{ 
    printf("HugeObject::copy constructor called\n"); 
} 

HugeObject SomeFunctionThatCreatesHugeObject() 
{ 
    ... 
    printf("SomeFunction returning HugeObject\n" 
} 

然後運行問題的代碼,並驗證已建成/複製的對象的預期數量。