頁:
[1]
(已解決)有關程式使用記憶體大小
本帖最後由 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> 大型記憶體不用開
直接用 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> 感謝大大幫我做我沒做好的測試...看來當初我測試 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> 在作業系統層,記憶體被分成至少 heap 和 stack 兩種
你的陣列用的是 stack,stack 的大小是有限制的 (所以才會有 stack overflow 這種東西呀 XDD
你可以藉由更改 linker 的設定來更改預設 stack 的大小
補充內容 (2017-1-10 07:40 PM):
不知道我講的和你的問題有沒有關係...?
頁:
[1]