[英]How can I be sure that Return value optimization will be done
我編寫了按值返回大型對象的函數。 我的同事抱怨它會做冗余復制並建議通過引用返回對象作為函數參數。 我知道將完成返回值優化並且將刪除副本,但代碼將用於可由不同編譯器編譯的庫中,並且我無法對所有這些編譯器進行測試。 為了說服我的同事保存按值返回對象,我需要一些文件說明。
我查看了c ++ 03標准,但找不到任何有關返回值優化的信息。 您能否給出一個文件(標准)的鏈接,其中定義了RVO將被完成。 或者,如果它不存在,我可以找到支持RVO的編譯器列表?
該標准永遠不會保證RVO發生,它只是允許它。
您可以檢查生成的實際代碼,以確定它是否發生,但這仍然不能保證它將來仍會發生。
但最后,在許多情況下,每個體面的編譯器都可以執行RVO,即使沒有發生RVO,C ++ 11(及更高版本)移動構造也可以使返回相對便宜。
您可以用來向同事證明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"
}
然后運行有問題的代碼,並驗證是否已構造/復制了預期的對象數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.