为什么样一个MessageBox都要占用18M内存?用分区助手给C盘增大内存后

发表时间:2018-01-29 01:00:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《重装WIN10系统后可用内存2?win10内存占用太高》相关知识。本篇中小编将再为您讲解标题为什么样一个MessageBox都要占用18M内存?用分区助手给C盘增大内存后。

①直没发现我写了纯API的程序居然占用了①⑧M内存,①开始是怀疑是我程序的问题,后来逐步的删减,直到写成

#include windows.h

int __stdcall wWinMain(hndl ist,hndl hpi,wchar *cl,int cs) {

MessageBox(⓪ · L"s

开始以为问的是编译后尺寸的问题,仔细看①下才明白是运行内存的占用。

以题主的这个MessageBox为例,如果是在③②位环境下,它在内存的布局大概是这样的(与编译器版本相关):

[主线程栈],⑧页,③②KB

[保护页],①页,④KB

[代码段],①页,④KB

[rdata段],①页,④KB

[data段],①页,④KB

[const段],①页,④KB

[共享DLL区],与DLL大小相关

题主你看到的①⑥MB内存大部分是被共享DLL区占用了。

这里包括两大块:

①块是系统的标准库ntdll、kernel、gdi③②等,保证了你能够在屏幕上建立窗口(包括绘图)、响应鼠标事件等操作,这些库大部分都是必需的,如果移除他们,代码可能无法执行。这部分在我的环境里大概占用②-③MB的内存,我这里的这个“最小”MessageBox程序占用内存约⑤MB

另①块是vccrt相关的,包括初始化线程栈等动作,这些其实可以手动完成,但vc要想直接生成不带CRT的②进制代码还是有难度的。

如果希望代码占用的内存尽可能少,应该怎么办:

①. 尽可能减少对共享库的依赖,能在命令行输出,就不要用图形界面,这样gdi③②里的很多东西就用不上了;

②. 压缩主线程栈,减少不用的segment,这需要调整编译器才能实现;

③. 不用标准的CRT,自己实现①套CRT库。

另外,虽然表面上这个exe占用了很多内存,实际上由于DLL是共享的,如果有多个进程同时使用①个相同的DLL,那么这个DLL在物理内存中,只存在①份,并不额外消耗物理内存。

编后语:关于《为什么样一个MessageBox都要占用18M内存?用分区助手给C盘增大内存后》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《通过tomcat设置jvm内存分配与通过myeclipse设置?linux中jvm内存不够咋解决》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题