malloc 最大可以分配多大內存

 引用:http://topic.csdn.net/u/20080801/01/2fa67f5e-3d2a-4d58-8b3d-a1fd36988458.html
要做高速圖像處理,用到大緩存,好像malloc做到644MB就上頂了,645MB就會獲得空指針

malloc的上限到底是多少啊?

系統:內存2GB,XP sp2系統,BDS 2007 w/ sp1
100  修改 刪除 舉報 引用 回覆
id="Topic_Zone" marginwidth="0" marginheight="0" src="/u/AD/Topic_Zone.aspx" frameborder="0" width="100%" scrolling="no" height="0">
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • dxkh
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-01 07:44:171樓 得分:0
分配內存用new看看
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • cczlp
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 4

發表於:2008-08-01 08:32:472樓 得分:20
32位程序上,理論上 <4G.
另外,你說的“高速”是什麼概念,內存這麼大,都是分配到硬盤上,不可能很快, 還是改進算法吧
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • thwen0101
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-01 08:41:203樓 得分:0
理論上是 <4G,不足到硬盤分
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • gtenfghg
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-01 08:52:454樓 得分:0
該回復於2008-08-01 14:39:37被版主刪除
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • akirya
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 6

    moremedalbtn.gif
發表於:2008-08-01 09:32:495樓 得分:5
windows核心編程上的東西說 ,大概在2G多一些
你用API分配內存試試看 ,可能是找不到連續的 那麼大內存的空間
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • jacknes009
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-01 09:46:556樓 得分:5
理論上是 <4G,不足到硬盤分

你用NEW試試。。。
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yuanreid
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-01 10:58:187樓 得分:5
我試過VirtualAlloc最大也是隻能分配到600多M,但看到有人可以分配到1G。也是不解。也許跟系統參數配置有關。
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • songhtao
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 3

    2

發表於:2008-08-01 14:19:168樓 得分:0
windows下用戶進程空間是2G因此肯定比2G要小
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • host88888
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 08:46:479樓 得分:0
該回復於2008-08-02 12:36:14被版主刪除
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • jacknes009
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 09:10:2010樓 得分:0
LZ有結果了嘛???
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 15:45:3511樓 得分:0
還沒有到其它機器上測試,理論上我的機器除了跑BDS,VS,LV之外,沒有別的東西,剛啓動完成時內存佔用300M左右(具體多少忘了,去辦公室才能看見),也就是說剩餘的1.7G內存中連續的內存塊最大才644M,這有點太不可思議了,如果真的是這樣,那XP的內存管理太爛了!
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 15:46:2012樓 得分:0
引用 1 樓 dxkh 的回覆:
分配內存用new看看
New和malloc在可獲得內存容量上應該內有太大區別吧
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 15:47:0813樓 得分:0
new和malloc在可獲得內存容量上應該沒有太大區別吧
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 15:47:4414樓 得分:0
有沒有兄弟願意幫忙試試?
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • akirya
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 6

    moremedalbtn.gif
發表於:2008-08-02 16:00:3515樓 得分:10
在我機器上運行成功,
我機器1G內存。
C/C++ code
#include<windows.h> int main(int argc,char **argv) { LPVOID lpVoid = VirtualAlloc( 0 , 1024*1024*1986 , MEM_COMMIT , PAGE_READWRITE); if( lpVoid ){ printf("分配成功/n"); Sleep(1000*15); VirtualFree( lpVoid , 1024*1024*1986 , MEM_RELEASE ); }else{ printf("分配失敗/n"); } return 0; }
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 16:01:5716樓 得分:0
引用 2 樓 cczlp 的回覆:
32位程序上,理論上 <4G.
另外,你說的“高速”是什麼概念,內存這麼大,都是分配到硬盤上,不可能很快, 還是改進算法吧
牛人進來先拜一下:)

...內存絕對要這麼大的,用途比較特殊,要求速度越快越好的場合,不便細說,仔細考慮了,算法優化我也想過,可能多緩衝區的做法能行,但我真的不想這麼做:(
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 16:04:5717樓 得分:0
引用 15 樓 akirya 的回覆:
在我機器上運行成功,
我機器1G內存。

C/C++ code
#include <windows.h>
int main(int argc,char **argv)
{
    LPVOID lpVoid = VirtualAlloc( 0 , 1024*1024*1986 , MEM_COMMIT , PAGE_READWRITE);
    if( lpVoid ){
        printf("分配成功/n");
        Sleep(1000*15);
        VirtualFree( lpVoid , 1024*1024*1986 , MEM_RELEASE );
    }else{
        printf("分配失敗/n");
    }
    return 0;
}

VirtualAlloc是不是把虛擬內存也用上了?這樣的話好像保證不了速度啊
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • akirya
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 6

    moremedalbtn.gif
發表於:2008-08-02 16:08:2618樓 得分:10
你看一下windows核心編程吧,裏面有講如何分配到將近3G的內存方法
這是其中的一段

當我最初觀察32位進程的地址空間的時候,我驚奇地發現可以使用的地址空間還不到我的
進程的全部地址空間的一半。難道內核方式分區真的需要上面的一半地址空間嗎?實際上回答
是肯定的。系統需要這個地址空間,供內核代碼、設備驅動程序代碼、設備I/O高速緩存、非
頁面內存池的分配和進程頁面表等使用。實際上Microsoft將內核壓縮到這個2GB空間之中。在
64位Windows2000中,內核終於得到了它真正需要的空間。
1.在x86的Windows2000中獲得3GB用戶方式分區
多年來,編程人員一直強烈要求擴大用戶方式的地址空間。爲了滿足這個需要,Microsoft
允許x86的Windows2000AdvancedServer版本和Windows2000DataCenter版本將用戶方式分
區擴大爲3GB。若要使所有進程都能夠使用3GB用戶方式分區和1GB內核方式分區,必須將
/3GB開關附加到系統的BOOT.INI文件的有關項目中。表13-1中的“32位Windows2000(x86
w/3GB用戶方式)”這一列顯示了使用3GB開關時它的地址空間是個什麼樣子。
在Microsoft添加/3GB開關之前,應用程序無法看到設置了高位的內存指針。一些有創意
的編程員自己將這個高位用作一個標誌,這個標誌只對他們的應用程序具有意義。這時,當應
用程序訪問內存地址時,運行的代碼將在內存地址被使用之前清除該指針的高位。可以想象,
第13章Windows的內存結構計計301
下載
當應用程序在3GB的用戶方式環境中運行時,該應用程序轉眼之間就會運行失敗。
Microsoft不得不提出一個解決方案,以便使該應用程序能夠在3GB環境中運行。當系統準備
運行一個應用程序時,它要查看該應用程序是否與/LARGEADDRESSAWARE鏈接程序開關相鏈接。
如果是鏈接的,那麼應用程序就聲稱它並沒有對內存地址執行什麼特殊的操作,並且完全準備充
分利用3GB用戶方式地址空間。另一方面,如果該應用程序沒有與/LARGEADDRESSAWARE開
關相鏈接,那麼操作系統將保留0x80000000至0xBFFFFFFF之間的1GB區域。這可以防止在已
經設置了高位的內存地址上進行內存分配。
注意,內核已經被緊緊地壓縮到了一個2GB的分區中。當使用3GB的開關時,內核勉強地
被放入一個1GB的分區中。使用/3GB的開關,可以減少系統能夠創建的線程、堆棧和其他資
源的數量。此外,系統最多隻能使用16GB的RAM,而通常情況下最多可以使用64GB的RAM,
因爲內核方式中沒有足夠的虛擬地址空間可以用來管理更多的RAM。
注意當操作系統創建進程的地址空間時,需要檢查一個可執行的LARGEADDRE
SSAWARE標誌。對於DLL,系統則忽略該標誌。在編寫DLL時,必須使之能夠在3
GB用戶方式分區中正確地運行,否則它們的行爲特性是無法確定的
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • wufanghua
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-02 23:49:4919樓 得分:5
這個進程內存應該和電腦內存沒有多大的關聯吧。
再說你那個是一次分配,沒有這麼大的連續的空間而已。
你可以在程序一開始就分配,這樣成功概率大一點。
不然就分多次分配,然後用一個結構管理一下,這個管理結構用類封裝一下,正常的操作在裏面用接口重新實現一下,在類外面使用上也感覺不出來,也應該不會影響你的使用的。
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • Behard
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-03 22:00:5820樓 得分:10
沒有具體研究過,不過幾種編譯器是不一樣的
我的電腦:XP SP2 物理3G內存,顯示爲 2.75G
BCB 5 malloc 能分配 1435M, BDS2007 能分配 720M
VC6 能分配 700 多M, VS 2005 沒有測試
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-23 22:00:0321樓 得分:0
感謝樓上的兄弟

我抽時間做了個簡單的測試:
同一臺機器,E6320,2G,XP w/sp2
C++ builder 2007 最大可分配644MB
VC 2005 最大可分配1.16GB

omg,BDS2007的內存管理太爛了!
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-23 22:00:3322樓 得分:0
突然發現自己有三條褲衩了:p
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • unsigned
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 3

    2

    5

發表於:2008-08-23 23:20:2323樓 得分:0
引用 21 樓 yf2100 的回覆:
感謝樓上的兄弟

我抽時間做了個簡單的測試:
同一臺機器,E6320,2G,XP w/sp2
C++ builder 2007 最大可分配644MB
VC 2005 最大可分配1.16GB

omg,BDS2007的內存管理太爛了!

如果你懷疑是RTL的問題,那試一下HeapAlloc,這個是Windows API跟C的RTL沒有任何直接關係.
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • unsigned
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 3

    2

    5

發表於:2008-08-23 23:22:0624樓 得分:20
關於Windows各版本的內存限制,可以參看下面頁面的表格:
Memory Limits for Windows Releases
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • unsigned
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 3

    2

    5

發表於:2008-08-23 23:27:4625樓 得分:0
Windows各內存分配接口的差別:http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-24 12:23:1126樓 得分:0
引用 25 樓 unsigned 的回覆:
Windows各內存分配接口的差別:http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
en,這個有用,受教了~謝謝~繼續學習中....

本帖不急着結,等俺研究出成果來再說:)

歡迎各位大俠繼續指教!
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • ouygg
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-26 11:48:0227樓 得分:0
多次申請。每次500M。
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-26 12:05:5028樓 得分:0
引用 27 樓 ouygg 的回覆:
多次申請。每次500M。
管理起來太麻煩,呵呵
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • unsigned
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
  • 3

    2

    5

發表於:2008-08-26 13:18:0829樓 得分:10
以前討論VirtualAlloc的貼子:
http://topic.csdn.net/u/20080128/09/c2678506-4193-4bfe-aaef-1c2b30520245.html
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • yf2100
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-08-26 17:03:5230樓 得分:0
引用 29 樓 unsigned 的回覆:
以前討論VirtualAlloc的貼子:
http://topic.csdn.net/u/20080128/09/c2678506-4193-4bfe-aaef-1c2b30520245.html

嗯,看了很有收穫,已經mark了

好在我這裏的內存分配申請不是很頻繁,不用擔心碎片和核心內存耗盡的問題:)
修改 刪除 舉報 引用 回覆
進入用戶個人空間
加爲好友
發送私信
在線聊天
  • likang8677
  • 等級:
  • 可用分等級:
  • 總技術分:
  • 總技術分排名:
發表於:2008-11-07 18:17:4531樓 得分:0
不錯的帖子,呵呵
發佈了23 篇原創文章 · 獲贊 4 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章