首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 巢狀 For 迴圈效能優化與堆疊溢位錯誤解析

     編輯:關於C++

巢狀迴圈效能優化原則

在多層巢狀迴圈中,若條件允許,應將迴圈次數最多的層放在最內層,次數最少的層放在最外層。這樣可減少 CPU 在迴圈層級之間切換的開銷,提升執行效率。

效能測試程式碼

以下程式碼對比兩種不同維度陣列的巢狀迴圈存取效能:

// For巢狀效能.cpp
#include <iostream>
#include <time.h>
using namespace std;

int main(void) {
    clock_t cstart, cends;
    
    // 測試 1:外層 5 圈,內層 10,000,000 圈
    cstart = clock();
    long sum1 = 0;
    long a1[5][10000000];
    for (long i = 0; i < 5; i++) {
        for (long j = 0; j < 10000000; j++) {
            sum1 += a1[i][j];
        }
    }
    cout << "sum1=: " << sum1 << endl;
    cends = clock();
    cout << "Clock 時間差: " << cends - cstart << endl;

    // 測試 2:外層 10,000,000 圈,內層 5 圈
    cstart = clock();
    long sum = 0;
    long a[10000000][5];
    for (long i = 0; i < 10000000; i++) {
        for (long j = 0; j < 5; j++) {
            sum += a[i][j];
        }
    }
    cout << "sum=: " << sum << endl;
    cends = clock();
    cout << "Clock 時間差: " << cends - cstart << endl;

    system("pause");
    return 0;
}

執行結果與堆疊溢位錯誤

程式在 Windows Server 2008 x64、Visual C++ 6.0 編譯通過,但執行時發生 Stack Overflow 錯誤:

錯誤原因與解決方案

錯誤發生在宣告 long a[10000000][5] 時,陣列大小約 400 MB,超過預設堆疊大小(通常 1~8 MB),導致堆疊溢位。

解決方法:在專案屬性中增加堆疊保留大小:

  1. 開啟專案屬性 → Linker → System
  2. 設定 Stack Reserve Size 為較大值(如 500000000,約 500 MB)
  3. 重新編譯執行

最佳實務建議

  • 大型陣列請使用動態記憶體配置(new/malloc 或 std::vector),避免佔用堆疊空間。
  • 巢狀迴圈優化時,結合記憶體存取局部性原則,讓內層迴圈連續存取記憶體,發揮快取效能。
  • 現代編譯器(開啟優化選項)通常能自動進行迴圈交換等優化,但理解原理有助於寫出高效程式碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved