查看完整版本: (已解決)有關程式使用記憶體大小
頁: [1]

baepi 發表於 2017-1-7 01:08 PM

(已解決)有關程式使用記憶體大小

本帖最後由 baepi 於 2017-1-10 08:27 PM 編輯

雖然我不確定單一程式是否可以擁有4G的空間~(只是想到32位元定址本來應該就能4G不是嗎?^^)
即便不能~至少應該也要有2G - 1 byte才是....以下是我的理解
單一陣列最大能設定到2147483647~也即是2G-1的byte
假設這限制是給最小單位的char用的~因此理論上應該要能有2G - 1 的空間
因此以下開始測試

小弟目前作業系統Win7~64位元~記憶體16G~在還沒執行VS2010時記憶體:硬體保留 1088MB
使用量    3289MB

已修改      538MB
待命       8801MB
可用       2641MB
程式碼也很簡單~可以說只有放置一行
long x;//1.5G之後就是在主程式卡一行等待輸入就關閉程式
另外組態用的是 Release 平台設定Win32 與x64....另外專案 >...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

inunu 發表於 2017-1-9 04:31 AM

大型記憶體不用開
直接用 malloc() 就好
否則你很快會卡在 image 大小的問題上
另外修改程式碼後需要 rebuild, 否則會繼續卡 not a valid win32 application...

底下這個我用 x64 debug 跑 Win7 Enterprise SP1 x64 (16GB RAM) 沒問題
Task manager 會顯示佔用 3.9GB 左右的記憶體

實際使用上要再考慮 fragmentation 問題
建議你還是把記憶體盡量分割成較適當的大小再進行管理
整體運作上會比較理想
#define SIZE 30*4096*4096

int main()
{
    long* x = (long*)malloc(SIZE * sizeof(long));
    if (x == NULL)
    {
        print f("Memory allocation failed: x\n");
        return -1;
    }
    long* y = (long*)malloc(SIZE * sizeof(long));
    if (y == NULL)
    {
        print f("Memory allocation failed: y\n");
        return -1;
    }


    x = 1234;
    x = 4321;
    y = 1234;
    y = 4321;

    print f("Test OK\n");

    getchar();

    free(x);
    free(y);
    return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

baepi 發表於 2017-1-9 10:39 PM

感謝大大幫我做我沒做好的測試...看來當初我測試 x64 時 並未把固定array設小就胡亂添加動態記憶體...還好意思說自己都做過多方測試了( 汗顏 )
經過大大的點醒~果然 x64就沒4G這天花板了...再次感謝大大的大力測試#define SIZE 15 * 4096 * 4096

double *t1 = NULL , *t2 = NULL , *t3 = NULL , *t4 = NULL , *t5 = NULL ;

void QQ()
{
        cout << "記憶體不足\n";
        abort();
}

void main()
{
        set_new_handler( QQ );

        t1 = new double[ SIZE ];
        if( t1 == NULL )
        {
                cout << "FQ 1\n";
                return ;
        }

        t2 = new double[ SIZE ];
        if( t2 == NULL )
        {
                cout << "FQ 2\n";
                return ;
        }

        t3 = new double[ SIZE ];
        if( t3 == NULL )
        {
                cout << "FQ 3\n";
                return ;
        }

        t4 = new double[ SIZE ];
        if( t4 == NULL )
        {
                cout << "FQ 4\n";
                return ;
        }

        t5 = new double[ SIZE ];
        if( t5 == NULL )
        {
                cout << "FQ 5\n";
                return ;
        }

        cout<<"YOOOO\n";
        int aa;
        cin >> aa ;

        delete [] t1 ;
        delete [] t2 ;
        delete [] t3 ;
        delete [] t4 ;
        delete [] t5 ;

        cin >> aa ;
}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

CoNsTaRwU 發表於 2017-1-10 07:38 PM

在作業系統層,記憶體被分成至少 heap 和 stack 兩種
你的陣列用的是 stack,stack 的大小是有限制的 (所以才會有 stack overflow 這種東西呀 XDD
你可以藉由更改 linker 的設定來更改預設 stack 的大小

補充內容 (2017-1-10 07:40 PM):
不知道我講的和你的問題有沒有關係...?
頁: [1]