優化前必須區分 Debug 版 (含符號、檢查、無優化) 與 Release 版 (內聯、循環展開、暫存器分配、臨時物件消除)。只在 Release 版上分析熱點、調優,Debug 版專責邏輯除錯。
C++ 允許在任意位置宣告變數,利用此特性延遲宣告至獲得初始值時:
// 低效:預設建構 + 賦值 (兩次函數呼叫)
string s;
s = "hello"; // operator=
// 高效:直接初始化 (一次建構)
string s("hello"); // 或 string s = "hello"; (C++11 列表初始化)
對內建類型 (int, pointer) 無差異;對類別型別,賦值多一次 `operator=` 呼叫,且可能涉及記憶體分配/拷貝。
// 低效:提前建構,可能根本不使用
void use() {
ExpensiveClass obj; // 建構開銷
if (!isNeeded()) return; // 白白付出
obj.doWork();
}
// 高效:延遲宣告
void use() {
if (!isNeeded()) return;
ExpensiveClass obj; // 僅在需要時建構
obj.doWork();
}
若 `ExpensiveClass obj[1000];` 提前宣告,效能災難。原則:宣告即初始化,就近使用,縮短作用域。
// 低效:成員預設建構 + 函數體賦值
class Foo {
string name_;
vector data_;
public:
Foo(const string& n, const vector& d) {
name_ = n; // string::operator=
data_ = d; // vector::operator=
}
};
// 高效:初始化列表直接建構
class Foo {
string name_;
vector data_;
public:
Foo(const string& n, const vector& d)
: name_(n), data_(d) {} // 直接複製建構,省一次預設建構+賦值
};
對 `const`、reference、無預設建構子的成員,**必須** 使用初始化列表。
// 後綴需建立暫存副本
Iterator operator++(int) {
Iterator tmp = *this;
++*this;
return tmp;
}
// 前綴直接修改並返回引用
Iterator& operator++() {
// ... increment logic
return *this;
}
對迭代器、智慧指標等類別型別,**習慣使用前綴**,除非確實需要舊值。
微觀優化 (初始化、前綴、就近宣告) 是寫出高效能 C++ 的基礎肌肉記憶。但演算法/資料結構/架構層面的優化 (宏觀) 收益往往大數量級。養成「先正確、再清晰、後測量、最後優化」的工程紀律,方能在複雜系統中持續交付高品質軟體。