我正在尝试实现一个堆(带有页眉/页脚的隐式空闲列表)并决定是否应该向其添加填充。添加焊盘有哪些实际好处?我读到它以某种方式减少了碎片,但我不太明白为什么会出现这种情况。此外,我感兴趣的是我能在时间方面获得什么样的性能优势。
这对我的程序中的局部性也有帮助吗?它有什么帮助?
我应该将整个 block 填充为 4 或 8 字节倍数的格式,还是应该填充我的 block (不包括页眉和页脚)。
忘记提及这是在 Linux 中使用 unistd 的 C 实现。
最佳答案
I read that it somehow reduces fragmentation, but I don't really understand why this is the case.
这是正确的。它之所以有效,是因为它设置了分配的最小大小。假设您添加了填充,以便每个 block 至少为 1kB。这意味着永远不会出现这样的情况:您释放了一 block 内存,并且之后进行的分配将不适合新释放的内存,只要新分配的大小最多为 1kB。
通过在纸上进行一些简单的实验,您可以轻松地亲眼看到这种效果。首先让 block 大小等于您的总内存。当然不会有碎片,但是你会浪费很多内存。如果 block 大小是一半大小,则情况基本相同,但浪费更少。当 block 大小为总内存的三分之一时,我们首先会遇到碎片。当分配中间 block 时就会发生这种情况。
简而言之,填充可以减少碎片,但需要更多内存。
Should I pad the entire block to a format of say 4 or 8 byte multiple or should I pad my block excluding the header and footer.
如果您以巧妙的方式实现它,那么您将能够通过简单地更改变量来更改填充大小。因此,找到一种方法来衡量问题并根据您的需要调整填充。
Does this also help locality in my program and how does it help?
这比较棘手。它可以是双向的,并且取决于使用堆的程序。但我的直觉告诉我,填充可能会降低局部性。如果是这种情况,可能会因缓存未命中而影响性能。
关于c - 动态内存分配中填充的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58781061/