[問題] allocate more than 4GB

看板C_and_CPP (C/C++)作者 (閉上眼的魚)時間14年前 (2012/04/06 20:38), 編輯推噓4(4024)
留言28則, 6人參與, 最新討論串1/2 (看更多)
開發平台(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

04/06 20:42, , 1F
Windows 我不知道,不過Linux的話你至少要寫一個 byte 到
04/06 20:42, 1F

04/06 20:43, , 2F
尾端才會實際配置給你。
04/06 20:43, 2F

04/06 20:43, , 3F
x86無理,x64才能用超過4G
04/06 20:43, 3F

04/06 20:48, , 4F
先謝謝Bencrie,我調用memset後就行了。
04/06 20:48, 4F

04/06 20:49, , 5F
@littleshan: 是在x86下開發,x64下執行 (我也要改成x64嗎)
04/06 20:49, 5F

04/06 20:49, , 6F
還是.. x64 和 x86 的 size_t 定義可能不一樣???
04/06 20:49, 6F

04/06 21:09, , 7F
當然不一樣囉 XD
04/06 21:09, 7F

04/06 21:11, , 8F
x64是可以執行x86的程式,但記憶體限制並不會自動消失
04/06 21:11, 8F
不好意思,想再多問幾句。 void * malloc ( size_t size ); 我不確定 x86/x64 對於 size_t 定義是否完全不同 (可能需要請人幫忙驗證), 但是否不用再特別強調 unsigned long long 當引數,自然而然用 size_t 即可? ※ 編輯: EdisonX 來自: 180.177.76.161 (04/06 21:31)

04/06 21:34, , 9F
size_t 的定義在不同的平台會不一樣...
04/06 21:34, 9F

04/06 21:35, , 10F
SIZE_MAX 是size_t的極限
04/06 21:35, 10F

04/06 21:39, , 11F
x86 單一程式最大使用記憶體2G win/linux一樣.
04/06 21:39, 11F

04/06 21:40, , 12F
x64在win下沒特別設定, 一樣2G限制, linux不清楚請板友補充
04/06 21:40, 12F

04/06 21:46, , 13F
妙了.請教x64需怎樣的額外設定?是否有文章可供參考?感謝!!
04/06 21:46, 13F

04/06 21:59, , 14F
vs2008請找專案中的 屬性 調整.
04/06 21:59, 14F

04/06 22:01, , 15F
屬性->連結器->啟用大型記憶體
04/06 22:01, 15F

04/06 22:01, , 16F
再找不到我也沒辦法了.....
04/06 22:01, 16F

04/06 22:02, , 17F
其他的compiler請找相關設定.
04/06 22:02, 17F

04/06 22:06, , 18F
謝謝latw!! vc2010 沒找到,不過有找到 #pragma 指令
04/06 22:06, 18F

04/06 22:07, , 19F
#pragma comment(linker,"/LARGEADDRESSAWARE:YES")
04/06 22:07, 19F

04/06 22:07, , 20F
測完再回報!感激不盡!
04/06 22:07, 20F

04/06 22:22, , 21F
sorry,多請教,那 printf 有沒有專屬 size_t 的 format ?
04/06 22:22, 21F

04/06 22:22, , 22F
我用 %u / %llu , 出來結果答案不一樣 Orz
04/06 22:22, 22F

04/06 22:33, , 23F
印象沒錯是 %z 的樣子?
04/06 22:33, 23F

04/06 22:34, , 24F
剛剛 google 了一下 應該是 %zu
04/06 22:34, 24F

04/06 22:40, , 25F
謝謝 L 大...這裡摸得好吃力啊 orz
04/06 22:40, 25F

04/06 22:42, , 26F
Orz 我補一下, %zu 是 c99 的, vc 不支援.
04/06 22:42, 26F

04/06 22:54, , 27F
linux 要調用超過2G的記憶體 可以去看posix規定
04/06 22:54, 27F

04/06 22:54, , 28F
POSIX
04/06 22:54, 28F
文章代碼(AID): #1FVkF8Lw (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FVkF8Lw (C_and_CPP)