返回值優化(Return Value Optimization,RVO)是 C++ 編譯器的一項重要優化技術,允許編譯器省略物件的複製建構與銷毀,直接在呼叫端的儲存空間建構回傳物件。這不僅提升效能,對於管理資源(如智慧指標的引用計數)的類別更是關鍵。
以簡單的 Dog 類別為例,包含建構函式、複製建構函式與解構函式的輸出追蹤:
Dog getDog() {
Dog d = Dog();
return d;
}
int main() {
Dog d = getDog();
return 0;
}
-fno-elide-constructors 關閉 RVO:出現三次複製建構與四次解構,效能大幅下降。Walter Bright 在 Zortech C++ 中首創「具名返回值優化」(NRVO),將回傳值的建構直接放在呼叫端的記憶體位置,等同於將函式簽名改為 void getDog(Dog* out)。現代編譯器(GCC、Clang、MSVC)皆支援 RVO 與 NRVO,但優化觸發條件略有不同。
WebKit 等大型專案大量使用智慧指標(如 RefPtr),頻繁的複製建構會導致引用計數的原子增減,嚴重影響效能。RVO 能有效避免不必要的複製,是高效能 C++ 程式碼的基石之一。