"pragma pack 1"可以帮助避免堆碎片吗?

piy*_*ush 11 c c++ memory-management memory-fragmentation

在我的程序中,我看到一些居民规模增加.我想这是因为堆碎片.所以我打算用#pragma pack 1.它会减少堆碎片吗?

它会有其他一些开销吗?

我要不要去吧?

ale*_*der 10

有一种经过充分证明的技术称为内存池.它专门用于减少内存碎片并帮助解决内存泄漏问题.它应该用于内存碎片成为程序功能瓶颈的情况.

'pragma pack 1'对避免堆碎片没有帮助.

'pragma pack 1'用于从结构中删除填充字节,以帮助在程序之间传输二进制结构.

  • 它也是Heartbleed bug起源的地方.;-) (4认同)

Som*_*ude 6

它只是操作系统的工作原理.释放已分配的内存时,它不会从进程内存映射中取消映射.这是一种来自操作系统的优化,以防过程需要再次分配更多内存,因为操作系统不必向进程内存映射添加新映射.


Dr.*_*ana 5

#pragma pack N,告诉编译器以特定方式对齐结构成员,使用(N-1)个字节填充.例如,如果N为2,则每个char将占用2个字节,一个分配,一个填充.当N为1时,将没有填充.这将有更多的碎片,因为如果结构说一个char和一个int,总共5个字节就会有奇数个字节.检查:#pragma pack效果


rcg*_*ldr 4

打包结构可能不会对堆碎片产生太大影响。当存在重复的内存分配和释放模式时,通常会发生堆碎片。这里有两个问题,一个问题是虚拟地址空间变得碎片化,另一个问题是物理 4k 页面最终会出现未使用的间隙,随着时间的推移消耗越来越多的内存。Microsoft 通过偶尔重新打包内存的 .net 框架解决了 4k 页面问题,但通过在重新打包期间“暂停”.net 应用程序来实现这一点。我不确定每天 24 小时/每周 7 天运行的服务器应用程序如何处理这个问题,而不必处理暂停,除非它们偶尔分叉一个新进程来接管服务器端,然后关闭旧进程进程,它将使用一组新的页面刷新新的进程虚拟地址空间。