**對基本類型 (int, float, 指針) 由值傳遞時,重新聲明「無性能差異」,但極大提升可讀性與維護性**。編譯器優化後生成的機器碼幾乎完全一致。
// 寫法 A: 直接使用參數
int add(int a, int b) {
return a + b; // 參數 a,b 即是局部變量
}
// 寫法 B: 重新聲明 (教科書風格)
int add(int a, int b) {
int x = a;
int y = b;
return x + y;
}
; 寫法 A 與 寫法 B 編譯後彙編幾乎完全相同
add:
lea eax, [rdi + rsi] ; 參數在寄存器 rdi, rsi
ret
// 無額外 mov 指令,編譯器直接使用參數寄存器
**零開銷抽象**:現代編譯器 (SSA 形式) 將參數視為不可變 SSA 值,重新聲明僅創建新 SSA 名稱,不產生額外存儲/搬運指令。
struct Big { char data[1024]; };
void foo(Big b) { // 參數在棧上佔 1KB
Big local = b; // 額外 1KB 棧拷貝 + memcpy 開銷
// ...
}
此時**避免重新聲明**,改用 `const Big&` 或 `const Big*` 傳遞。
| 場景 | 建議 |
|---|---|
| 基本類型 / 指針 / 小結構體 (≤ 16 bytes) | **可重新聲明** 以提升可讀性,零性能損耗 |
| 大結構體 / 數組 | **禁止值傳遞**,改 `const&` / `const*`,不重新聲明 |
| 需修改參數並反映調用方 | **指針/引用傳遞**,函數內直接操作,命名加 `out_` 前綴 |
| 遞歸/回調函數 | 參數即狀態,**不重新聲明**,減少棧幀大小 |
**重新聲明參數是「好習慣」而非「優化手段」**。對基本類型零成本,對可讀性/防錯/調試極大收益。**代碼寫給人看,順便給機器跑**。