我是出于好奇而不是真正的需求,但是这个微小的MSVC ++程序的内存使用量会进一步降低吗? BitBucket上的源文件 。
该程序编译“优化代码大小”。 它创build一个只有消息的窗口并设置一个键盘钩子,显示一个托盘图标以响应Caps / Num / Scroll Lock键的按下。
根据VMMap,专用字节分配如下:
260 KB: Image 252 KB: Heap 240 KB: Page Table 24 KB: Stack 24 KB: Private Data ------ 800 KB TOTAL
图片
应用程序本身只用了20 KB; 其余的是由十几个DLL消耗的。 看起来这是如此之小。
堆
该程序仅在堆上分配大约3 KB的数据:恰好是某个类的三个实例。 其余的必须来自CRT和/或标准的OS代码。
这可能会减less吗? 这看起来像是储蓄的主要候选人。
页表
这个程序的总虚拟大小是44 MB,大约是11k页。 平均每页22个字节(虽然大概是一堆条目放在一边未使用)。 所以这可能不能再减less了。 或者可以吗?
堆栈和私有数据
那么,那些已经疯狂的小…虽然我想知道他们为什么不是更小。 该程序没有任何附近的私人数据或堆栈,我想。
你能build议如何使这些部分比现有的小吗?
进一步发现:
CreateWindow
添加420 KB 所以看起来这个内存的大部分内容都被Windows API所占用,这似乎排除了进一步的减less,除非可以在不创build窗口的情况下使钩/托盘图标工作(这个程序已经忽略了所有的消息) 。
可以通过依赖操作系统提供的API(在DLL中已经映射到进程中)完全省略C运行时库,或者自己实现它们。
这通常是不值得的,除非你已经尽量少用语言的运行库。 这也使您的应用程序更便携。
“进程环境块”包含所有环境变量的副本。
如果你没有继承任何环境(即父进程使用干净的环境产生),那么相对于你现在看到的总的内存使用情况,这可能会导致明显的下降。
您可以使用“pragma pack(1)”来保证在成员的内存空间之间不会分配额外的空间。
http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx
从这个答案中 ,私有字节是显式提交或标记为MEM_PRIVATE
的内存MEM_PRIVATE
或已写入的可执行页面。 因此,如果您动态分配存储而不是使用全局变量(包括本地静态函数),则应尽可能减少私有字节的使用量,尽管您可能会增加整个堆的使用率。