piy*_*ush 11 c c++ memory-management memory-fragmentation
在我的程序中,我看到一些居民规模增加.我想这是因为堆碎片.所以我打算用#pragma pack 1
.它会减少堆碎片吗?
它会有其他一些开销吗?
我要不要去吧?
它只是操作系统的工作原理.释放已分配的内存时,它不会从进程内存映射中取消映射.这是一种来自操作系统的优化,以防过程需要再次分配更多内存,因为操作系统不必向进程内存映射添加新映射.
#pragma pack N
,告诉编译器以特定方式对齐结构成员,使用(N-1)个字节填充.例如,如果N为2,则每个char将占用2个字节,一个分配,一个填充.当N为1时,将没有填充.这将有更多的碎片,因为如果结构说一个char和一个int,总共5个字节就会有奇数个字节.检查:#pragma pack效果
打包结构可能不会对堆碎片产生太大影响。当存在重复的内存分配和释放模式时,通常会发生堆碎片。这里有两个问题,一个问题是虚拟地址空间变得碎片化,另一个问题是物理 4k 页面最终会出现未使用的间隙,随着时间的推移消耗越来越多的内存。Microsoft 通过偶尔重新打包内存的 .net 框架解决了 4k 页面问题,但通过在重新打包期间“暂停”.net 应用程序来实现这一点。我不确定每天 24 小时/每周 7 天运行的服务器应用程序如何处理这个问题,而不必处理暂停,除非它们偶尔分叉一个新进程来接管服务器端,然后关闭旧进程进程,它将使用一组新的页面刷新新的进程虚拟地址空间。