現代編譯器(MSVC、GCC、Clang)在 -O2//O2 下會將 **迴圈不變量外提**,內部宣告的基本型別變數(int j)編譯後與外部宣告**機器碼完全相同**,零開銷。
// 內部宣告
for (int i=0; i<1000; ++i) {
int j = 0;
for (; j<1000; ++j) {}
}
// 外部宣告
int j;
for (int i=0; i<1000; ++i) {
j = 0;
for (; j<1000; ++j) {}
}
反組譯顯示兩者皆使用暫存器迴圈計數器,無額外記憶體存取。