【发布时间】:2013-04-30 05:56:16
【问题描述】:
- 位置
- 在堆中,碎片化(每个节点都使用 malloc) - 在几种不同的方面效率低下(缓慢分配、缓慢访问、内存碎片)
- 在堆中,在一大块中 - 当需要重新分配时,数据结构获得的所有灵活性都会丢失
- 在堆栈中 - 堆栈的大小往往相当有限,因此根本不建议在其上分配大型结构
它们的最大优势,插入 O(1),在碎片化内存和数千次调用内存分配器给我们另外 10 个字节的环境中似乎相当无用。
编辑澄清:
这个问题是在一次采访中被问到的。这不是一个职场问题,因此希望从一小组标准算法中盲目地做出正确决定的通常启发式方法并不适用。
现有的答案和 cmets 提到“malloc 并没有那么慢”,“malloc 部分对抗碎片”。好的,如果我们使用另一种数据结构,例如 C++ 向量的 C 端口(即 - 分配足够大小的顺序内存,如果数据扩展,则重新分配到两倍大的块)所有问题都解决了,但我们失去了快速插入/删除。链表(分配在哪里?)比向量有很大优势的任何场景?
【问题讨论】:
-
大多数
malloc实现已经有代码来减少碎片的影响(例如,它们已经分配了更大的块并给了你一块)。 -
为什么说插入 O(1) 失去了优势?即使在碎片内存上,内存分配操作也不会那么昂贵。
-
@Geek,Alligment,碎片,泄漏,指针间接 - 在独立内存块中静态分配的列表有很多缺点。只是为了快速插入/删除。
-
@Vorac:您是否考虑过操作系统分页可能对缓存局部性产生的影响,如果它在向/从二级存储分页时执行合理的重定位?
-
这整个问题太天真了...使用大块内存只是意味着您正在实现自己的堆例程 - 将问题转移到经验不足的手中:只有当你有一些时才有可能获胜特别了解节点的确切大小或相对寿命。这里有意义的一般问题是向量和链表之间的旧性能权衡 - 当然链表有时具有巨大的优势......例如一个最近最少使用的容器(用于缓存),其中刚刚使用的节点需要不断地移到前面。列表节点有稳定的地址:另一大优势。
标签: c memory-management