簡體   English   中英

是否可以指示編譯器刪除C ++中返回的variant_t的副本?

[英]Can a compiler be instructed to elide away the copy of variant_t being returned in C++?

我希望在數據庫訪問代碼中編寫一個方法:

variant_t GetQueryRows (...)

我想稱之為:

const variant_t result = GetQueryRows (...)

盡管我可以做到,但對profile_t的復制在我的探查器結果中顯示出很高的水平。 因此,我需要確保variant_t不被復制。 在variant_t中沒有移動構造函數或移動分配,並且我無法修改variant_t的源以添加一個。

除了通過out參數返回“結果”這一顯而易見的事情,我還能在Visual Studio 2012中使用C ++做任何事情嗎?

您無法做任何保證。 如果可能的話,編譯器通常會通過返回值優化來消除此副本,但有一些警告。

GetQueryRows ,應該僅從函數的一點返回一個命名變量;該變量僅從函數的一點返回。 多次返回,或可能返回一個值或另一個值的返回值,會中斷返回值優化。 您不能拋出任何異常。

如果要保證行為,則使用輸出參數是唯一可靠的方法。

編譯器將通過稱為返回值優化的優化來避免復制。 如果可能,它們將由編譯器應用,您不能強制執行。 另外,您可以使用移動語義來避免深層復制。

不要讓程序的邏輯依賴於這種優化。 但是,以某種方式編寫代碼,以便鼓勵編譯器應用這些優化。

如果這樣構造GetQueryRows則很可能發生通過返回值優化進行復制省略的情況:

const variant_t GetQueryRows() {
    variant_t result;  // Exactly one declaration of return value
    ...                // arbitrary code
    return result;     // Exactly one return statement.
}

參考: http : //msdn.microsoft.com/zh-cn/library/ms364057(v=vs.80).aspx

暫無
暫無

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

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