看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc2010 問題(Question): malloc 有辦法一次超過 4 GB 嗎? 我拿下面這段碼去測某台 PC, 結果超過了 4GB, 但實務上我沒辦法一次 malloc 那麼大 (引數也只是 size_t), 請問是否有其他方式可處理掉? 程式碼(Code):(請善用置底文網頁, 記得排版) #define MB (1024*1024) size_t mb=0; while(malloc(MB)) ++mb; printf("%u (mbs)\n", mb); 補充說明(Supplement): 另在這段像在 「 燒機 」的程式碼, release mode 下會被完全忽略, 不知是否有方式讓它正常運作?謝謝各位。 -- If there is no tomorrow, I want to see u last time. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
Bencrie:Windows 我不知道,不過Linux的話你至少要寫一個 byte 到 04/06 20:42
Bencrie:尾端才會實際配置給你。 04/06 20:43
littleshan:x86無理,x64才能用超過4G 04/06 20:43
EdisonX:先謝謝Bencrie,我調用memset後就行了。 04/06 20:48
EdisonX:@littleshan: 是在x86下開發,x64下執行 (我也要改成x64嗎) 04/06 20:49
EdisonX:還是.. x64 和 x86 的 size_t 定義可能不一樣??? 04/06 20:49
littleshan:當然不一樣囉 XD 04/06 21:09
littleshan:x64是可以執行x86的程式,但記憶體限制並不會自動消失 04/06 21:11
不好意思,想再多問幾句。 void * malloc ( size_t size ); 我不確定 x86/x64 對於 size_t 定義是否完全不同 (可能需要請人幫忙驗證), 但是否不用再特別強調 unsigned long long 當引數,自然而然用 size_t 即可? ※ 編輯: EdisonX 來自: 180.177.76.161 (04/06 21:31)
firejox:size_t 的定義在不同的平台會不一樣... 04/06 21:34
firejox:SIZE_MAX 是size_t的極限 04/06 21:35
latw:x86 單一程式最大使用記憶體2G win/linux一樣. 04/06 21:39
latw:x64在win下沒特別設定, 一樣2G限制, linux不清楚請板友補充 04/06 21:40
EdisonX:妙了.請教x64需怎樣的額外設定?是否有文章可供參考?感謝!! 04/06 21:46
latw:vs2008請找專案中的 屬性 調整. 04/06 21:59
latw:屬性->連結器->啟用大型記憶體 04/06 22:01
latw:再找不到我也沒辦法了..... 04/06 22:01
latw:其他的compiler請找相關設定. 04/06 22:02
EdisonX:謝謝latw!! vc2010 沒找到,不過有找到 #pragma 指令 04/06 22:06
EdisonX:#pragma comment(linker,"/LARGEADDRESSAWARE:YES") 04/06 22:07
EdisonX:測完再回報!感激不盡! 04/06 22:07
EdisonX:sorry,多請教,那 printf 有沒有專屬 size_t 的 format ? 04/06 22:22
EdisonX:我用 %u / %llu , 出來結果答案不一樣 Orz 04/06 22:22
LPH66:印象沒錯是 %z 的樣子? 04/06 22:33
LPH66:剛剛 google 了一下 應該是 %zu 04/06 22:34
EdisonX:謝謝 L 大...這裡摸得好吃力啊 orz 04/06 22:40
EdisonX:Orz 我補一下, %zu 是 c99 的, vc 不支援. 04/06 22:42
firejox:linux 要調用超過2G的記憶體 可以去看posix規定 04/06 22:54
firejox:POSIX 04/06 22:54