C++ constexp vs const
constexpr
是在 C++11 標準中引入的關鍵字,目的是為編譯時常量提供更強大的支援。它允許某些表示式在 編譯期進行求值,從而提高效能和最佳化能力。下面詳細說明它與 const
的區別。
constexpr
和 const
的區別
特性 | constexpr |
const |
---|---|---|
引入版本 | C++11 | C++ 語言的早期版本 |
常量求值時間 | 編譯時(如果可能) | 執行時常量 |
使用範圍 | 變數、函式、建構函式 | 變數 |
可變性 | 只能用於完全確定的編譯期常量 | 執行時不能改變 |
適用性 | 可用於定義常量函式和複雜計算 | 主要用於變數宣告 |
1. 編譯期 vs. 執行期
constexpr
確保一個變數、表示式或函式能在 編譯期完成求值(如果表示式足夠簡單)。const
只保證變數的值在執行時不可變,但不一定是在編譯時確定的。
示例:
constexpr double pi = 3.14159; // 編譯期求值
const double runtime_pi = 3.14159; // 執行時常量
int main() {
constexpr int x = 5 * 5; // 編譯期計算
const int y = x * 2; // 執行時計算也可以,但不保證在編譯期完成
return 0;
}
- 在這個例子中,
pi
和x
是 編譯期常量,但y
只被宣告為 執行時常量。
2. constexpr
函式
C++11 引入了 constexpr
函式,它允許函式在編譯期進行求值。
示例:constexpr
函式
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int value = square(5); // 在編譯期求值
const int runtime_value = square(10); // 在執行期求值
return 0;
}
square(5)
會在編譯期求值,而square(10)
由於依賴於執行時輸入,只能在執行時求值。
3. 什麼時候使用 constexpr
?
- 需要編譯期常量:用於陣列大小、模板引數等必須在編譯期確定的地方。
- 提高效能:減少不必要的執行時計算。
- 複雜的常量表示式:
constexpr
支援呼叫其他constexpr
函式。
示例:constexpr
陣列大小
constexpr int getSize() {
return 10;
}
int array[getSize()]; // 陣列大小必須在編譯期確定
4. 相容性問題
由於 constexpr
是 C++11 引入的關鍵字,在較老的編譯器(如 POJ 上的 G++ 可能只支援 C++98 或 C++03)中會導致編譯錯誤。在這種情況下,你需要將 constexpr
替換為 const
,但要注意這可能會導致某些編譯期計算改為執行時計算。
總結
constexpr
用於定義編譯期常量,可以用於變數、函式、建構函式,確保在編譯期完成求值。const
僅保證變數在執行時不可變,但它的值可能需要在執行時計算。- 如果你在一個需要支援較老版本編譯器的平臺上(如 POJ),應避免使用
constexpr
,改用const
來保持相容性。