#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A()\n"; }
A(const A& a) { cout << "A(const A&)\n"; }
};
void foo(A a) { } // 參數按值傳遞
int main() {
A a; // 1. 默認構造
foo(a); // 2. 複製構造傳參
// 3. 函數結束銷毀參數
return 0;
}
// 輸出:
// A()
// A(const A&) ← 這裡
// A(const A&) ← 這裡(返回值優化 RVO 可能消除)
foo(a) 時,按值傳遞觸發複製構造。A(非引用),臨時對象構造後再複製給調用方(C++17 前)。| 優化 | 標準 | 效果 |
|---|---|---|
| RVO (Return Value Optimization) | C++98/11 | 編譯器直接在調用方棧框構造返回對象,**消除返回值複製** |
| NRVO (Named RVO) | C++11 | 具名變量返回時同樣優化 |
| 強制移動語義 | C++11 | 返回右值引用 A&& 或依賴移動構造(若類定義) |
| 拷貝省略 | C++17 | 強制要求編譯器省略臨時對象複製,**不再依賴優化** |
void foo(const A& a) 避免第一次複製。A create() { return A(); }。A(A&&) noexcept,讓不可省略時也能高效移動。delete 複製構造,僅支持移動。「C++98 兩次,C++11 RVO 可能一次,C++17 強制零次(拷貝省略)。實戰中:參數用 const&,返回用值,定義 noexcept 移動構造。」