編碼的世界 / 優質文選 / 財富

Win7 64位下讓VC++6.0編寫的Win32程序單進程運行內存突破2G


2022年5月18日
-   

最近在調試一個大型的MFC程序的時候,需要在Cview類中申請一個double(float)array[2100][400][500]的三維數組,首先聲明一點,算法比較複雜,暫時沒有辦法去修改算法,所以必須要申請一個這麼大的三維數組空間。
(1)首先在棧中申請了一個固定數組array[2100][400][500],結果VC提示超出棧的保留空間了。這種方法OUT
(2)然後用std::vector<std::vector<std::vector<2100> > > grdarray(400,vector<vector<float> >(NY,vector<float>(500)));去申請一個三維嵌套的Vector,內存上是可以分配的,但是在進行賦值的時候不如數組方面,出現錯誤,這種方法也被排除。
(3)malloc去申請一個一個內存空間存儲三維數組,可以運行,但是在程序運行過程中,出現內存不足的提示。
(4)new一個三維動態數組,也是可以申請那麼多的內存,但是依然在運行的過程中出現內存不足的提示。
這讓我很費解,一度去檢查了是不是程序出現內存泄露或者是死循環,但是不幸是,沒有。
        在網上進行一波搜索之後才領悟到:雖然現在電腦是Win7 64位,但是VC++6.0是從Win32的平台移植到win7 64位上的,所以歸根結底,依然VC++6.0編寫出來的程序依然是Win32程序,Windows系統對於Win32程序的單進程可用內存進行了限制,即最多可用2G內存,其餘2G預留給操作系統,即使你是在win64的平台下運行win32程序,單進程也只能調用2G內存。
但是我在Cview類的構造函數中申請一個float型的2100*400*500的動態數組,我差不多需要1.7G內存,加之在程序運行過程中需要分配一些結構體,容器以及數組的內存以及程序本身的內存,很有可能超過2G,這就是為什麼在程序運行過程中提示內存不足的原因。
百度了一下,現在貼下一些大大寫的技術以及博客的鏈接,對我了解這個問題以及解決這個問題幫助極大,在此感謝以下的技術大大
      (1)32位模式下C/C++程序可用最大內存  http://m.blog.csdn.net/article/details?id=45534015
      (2)開啟PAE以及突破win32系統單個程序的2G內存限制 - Q75X的日志 - 網易博客  http://blog.163.com/xs98775@yeah/blog/static/86284853201303111575240/
      (3)讓32位應用程序不再為2G內存限制苦惱 - 一蓑煙雨的專欄 - 博客頻道 - CSDN.NET  http://blog.csdn.net/flyingworm_eley/article/details/6523326
      (4) 64位Windows7系統下讓32位程序支持4G虛擬內存 | 上岸QQ的魚  http://www.saqqdy.com/computer-skills/64-windows7-system-to-support-32-bit-process-virtual-memory-4g
       (5) 32位,64位和內存的那點事 | 果殼網移動版  http://m.guokr.com/blog/61322/
       在看了上述的博客後我總結了下列的方法,其細節以及原由還是點擊上述的鏈接進去查看、
      (1)修改boot.ini文件,開啟PAE以及AWE模式,修改本地安全策略,見這篇博客32位模式下C/C++程序可用最大內存  http://m.blog.csdn.net/article/details?id=45534015
以及這篇博客讓32位應用程序不再為2G內存限制苦惱 - 一蓑煙雨的專欄 - 博客頻道 - CSDN.NET  http://blog.csdn.net/flyingworm_eley/article/details/6523326還有這篇博客
開啟PAE以及突破win32系統單個程序的2G內存限制 - Q75X的日志 - 網易博客  http://blog.163.com/xs98775@yeah/blog/static/86284853201303111575240/
(2)下載一個小插件,這個插件可以讓你為指定的.exe win32程序成功的使用超4G的內存,親測可用。見這篇博客64位Windows7系統下讓32位程序支持4G虛擬內存 | 上岸QQ的魚
 http://www.saqqdy.com/computer-skills/64-windows7-system-to-support-32-bit-process-virtual-memory-4g 
插件的下載鏈接我分享到百度網盤:http://pan.baidu.com/s/1i4KkJ9j
(3)最根本的方法還是將你的整個程序一直到win 64位的VS上,win64位的程序理論上單進程可用內存比win32程序要大的多。
 
如果您覺得這篇博文有用,請訪問我的個人站:http://www.stubbornhuang.com,更多博文乾貨等著您。

熱門文章