首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 對象模型:編譯器如何處理函數返回對象(NRV 優化)

     編輯:關於C++

現象

函數返回類對象時,理論上會調用拷貝構造函數創建臨時對象再拷貝給調用者。但實測只調用一次構造函數,無拷貝構造輸出。

編譯器處理步驟

  1. 傳統轉換:為函數添加隱藏引用參數 __result,在 return 前插入拷貝構造 __result.X::X(xx)。調用點轉為 X xx; func(xx);。仍有一次拷貝構造。
  2. NRV (Named Return Value) 優化:直接用 __result 替換局部對象 xx,在 __result 上直接構造,省去拷貝。轉換後函數:void func(X& __result) { __result.X::X(); __result.setData(101); }。調用點不變。結果:零拷貝構造。

代碼演示


class X {
public:
    X() { cout << "X::X()" << endl; }
    X(const X&) { cout << "X::X(const X&)" << endl; }
    void setData(int) {}
};
X func() { X xx; xx.setData(101); return xx; }
int main() { X xx = func(); return 0; }
// 輸出僅 "X::X()",NRV 優化生效

注意事項

  • NRV 是編譯器優化,非標準強制,複雜函數(多返回路徑、條件構造)可能不觸發。
  • C++11 移動語義進一步減少拷貝開銷,但 NRV 仍是零開銷的最優情況。
  • 不應依賴 NRV 進行副作用邏輯(如計數器),應假設拷貝可能發生。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved