gpt4 book ai didi

c - 链表。在哪里分配以及如何应对碎片化?

转载 作者:行者123 更新时间:2023-12-04 09:42:33 28 4
gpt4 key购买 nike

  • 位置
  • 在堆中,碎片化(每个节点的 malloc) - 在几种不同的方式(缓慢分配,缓慢访问,内存碎片)方面效率低下
  • 在堆中,在一个大块中 - 当需要重新分配
  • 时,数据结构获得的所有灵活性都将丢失
  • 在堆栈中 - 堆栈的大小往往相当有限,因此根本不建议在其上分配大型结构

  • 它们的巨大优势,插入 O(1),在内存碎片化和数千次调用内存分配器以再给我们 10 个字节的环境中似乎毫无用处。

    编辑以澄清:
    这个问题是在一次采访中被问到的。这不是工作场所的问题,因此希望从一小组标准算法中盲目地做出正确决定的通常启发式方法是不适用的。

    现有的答案和评论提到“malloc 不是那么慢”,“malloc 部分地与碎片作斗争”。好的,如果我们使用另一种数据结构,例如 C++ vector 的 C 端口(即 - 分配足够大小的顺序内存,如果数据扩展,重新分配到两倍大的块)所有问题都解决了,但我们失去了快速插入/删除。链表(分配在哪里?)比 vector 具有巨大优势的任何场景?

    最佳答案

    理想情况下,您的链表实现不应使用上述任何内容。应该由调用者来分配和销毁内存。想想像 sprintffgets 等函数......它们是否分配了任何内存?不,这是有原因的:简单。想象一下,如果你必须 free 你从 fgets 得到的一切(或者更糟的是, fscanf )。那不会很痛吗?尝试开发您的函数以与标准库保持一致。

    声明 listnode_alloc 函数可能会有所帮助,但这只会包装 malloclistnode_init 函数。考虑 realloc 如何处理 NULL 输入...

    关于c - 链表。在哪里分配以及如何应对碎片化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293118/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com