c - 动态内存分配中填充的重要性

标签 c heap-memory dynamic-memory-allocation cache-locality

我正在尝试实现一个堆(带有页眉/页脚的隐式空闲列表)并决定是否应该向其添加填充。添加焊盘有哪些实际好处?我读到它以某种方式减少了碎片,但我不太明白为什么会出现这种情况。此外,我感兴趣的是我能在时间方面获得什么样的性能优势。

这对我的程序中的局部性也有帮助吗?它有什么帮助?

我应该将整个 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/

相关文章:

在 C 中将二维数组中的 int 转换为 void

java - 在 Kafka Consumer 中反序列化 Avro 数据包时出现堆空间问题

java - 在 Windows 7(64 位)上将 Tomcat Java 堆大小设置为 8GB 时出现问题?

java - Liquibase generateChangeLog 失败 : Java heap space

c - 输入的动态内存分配?

c - 对 FINTEK F81866A 芯片组上的 GPIO 引脚进行编程

c - NOP 字符 0x90 的 printf 在 x86_64 和 i686 上编译时不同

c - 如何修复calloc时的内存泄漏

c - 双指针的动态内存分配将大小作为一个,但可以容纳一个超过一个字节的字符串。这怎么可能?

c - 如何避免在这个程序中输出前打印空行?