【问题标题】:Is there a library or an malloc implementation, which allocates memory on heap as/like on stack?是否有一个库或 malloc 实现,它在堆上分配内存,就像/在堆栈上一样?
【发布时间】:2011-11-29 14:47:23
【问题描述】:

我需要大块获取堆内存。而这些内存块将被用作内存池,直到进程退出才会被释放。 所以,传统的malloc 可能不像我想要的那么简单(也没有那么快)。 我认为,类似堆栈的分配 (LIFO) 会比 malloc 更有效。

是否有任何现有的库可以做到这一点? 或者我应该为此写一个新的?

PS:我猜obstack 最能描述我在说什么。还有其他关于obstack的候选人或介绍吗?

【问题讨论】:

  • 您在问题中做了几个毫无根据的假设 - 只需使用常规 malloc 调用进行内存分配,一切都会正常工作。 (如果由于某种原因它没有,那么您以后可以随时替换 malloc 实现。)
  • 在你跳得太远之前,你有没有尝试过一些替代的 malloc 实现?例如。 tcmalloc?
  • '堆内存分配作为栈上的方式'你是什么意思?
  • 您能否解释一下为什么确切地您认为malloc 可能无法胜任这项任务?
  • malloc 可以胜任这项任务。但是,它(通常)在分配时会锁定堆;在我的情况下,它在分配和释放方面具有不必要的灵活性(通常具有更多的运行时开销),这两者都可以出于性能原因进行优化。

标签: c memory-management heap-memory stack-memory


【解决方案1】:

听其他人说首先要有效地使用malloc,但如果您确实需要一个基于区域的分配器,它可以大量释放内容,请查看 Apache Portable Runtime 库。

【讨论】:

    【解决方案2】:

    来自Wikipedia:

    在 C 中,库函数 malloc 用于在堆上分配一块内存。

    malloc 将非常简单和快速。

    还有,这是什么意思?

    我觉得把堆内存分配看成栈上的方式就可以了。

    如果你的意思是你想为你的内存池使用堆栈空间,你会失望的。堆栈通常只有几 MB(精确大小取决于机器和编译器)。也许你有你的堆栈和堆倒退的想法?堆栈是带有参数和局部变量的函数框架所在的位置;堆是持久的、动态分配的内存所在的地方。

    【讨论】:

    • 感谢您的回答。我的意思是,我想从堆中分配 FILO 内存,而堆栈上的内存是分配 FILO 的,不是吗?
    • 是的,堆栈是 FILO。如果不了解更多有关您要做什么的信息,很难做出更具体的建议,但如果您知道所需的最大堆栈大小,您可以malloc 一次并保留指向末尾的指针
    【解决方案3】:

    malloc 在反复调用时会导致速度变慢,例如在三重嵌套循环的中间。如果您使用malloc 分配几个大块并长时间持有它们,那么您已经有效地使用malloc。

    例如,假设您正在处理 3D 点数据,并且您有一个 struct Point。如果您使用Point ** 数组并单独分配每个点,例如:

    for (int i = 0; i < size; ++i)
        points[i] = malloc(sizeof(struct Point));
    

    会很慢。但是使用struct Point而不是struct Point *的块,你会提前计算出大小并且只调用malloc一次。

    points = malloc(sizeof(struct Point) * size);
    

    没关系,因为malloc 只运行一次。

    【讨论】:

    • 我同意,频繁调用malloc和free也可能导致大量的分片块,因为空闲块是通过freelist连接的。然而,这就是问题所在。是否可以减少列表的开销?类似堆栈的分配可能更有效。
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2011-08-01
    • 2020-03-30
    • 2010-11-06
    相关资源
    最近更新 更多