【问题标题】:Best way to expand dynamic memory in C在 C 中扩展动态内存的最佳方法
【发布时间】:2013-01-05 10:53:09
【问题描述】:

我正在寻找一种在运行时为现有结构(最初已经分配了内存)分配额外内存(在 C 中)的方法。我有一种感觉,我可能可以使用memmove 或类似的东西,但这仍然只是一个复制操作,并且不会增加运行时结构可用的内存量。此外,我不想每次需要复制整个结构,这将在程序期间进行数百次(结构已经很大)。有人可以帮忙吗?

更新:感谢大家的回复。为了提供更多细节,我正在尝试运行一个 MPI 并行代码,该代码最初创建该结构的许多实例(称为“S”)。该结构的每个实例都包含一个数组“T”,它记录了在代码运行时发生的特定事件的时间。这些事件在运行时发生,并且每个 S 实例的事件数量不同。例如,S[0] 可能看到 100 个事件(因此需要一个长度为 100 个元素的数组),但 S[1] 可能只看到 1事件(和 S[2] 30 个事件等)因此,在开始时为 S 的每个实例(有数百万个)分配大量内存是非常浪费的,因为有些可能会填满数组,而另一些则不会甚至接近。确实,我已经尝试过了,但对于我正在运行它的机器来说,它太多了。

我会在这里尝试一些想法并发布我的进展。非常感谢!

【问题讨论】:

  • 您无法知道操作系统是否会将已分配的内存复制到新的内存分配中。这取决于内存管理器,并且在操作系统下运行的 C 程序无法访问。
  • 你不能。为什么不告诉我们你想要做什么,我们会告诉你如何做。
  • 您应该向我们描述您的结构。如果您希望它在运行时变大,为什么不从变大开始呢?另一种方法是将内存池链接在一起并分段实现数组。有点像 C++ 中的 deque 数据结构。

标签: c memory memory-management


【解决方案1】:

你或许可以使用realloc()

【讨论】:

  • 记住它可能会移动旧的内容,如果新的内存块比旧的大,那么旧的指针是无效的
【解决方案2】:

没有办法按照您的描述进行操作,因为无法保证在您的结构当前占用的内存旁边会有可用内存。

标准做法是分配更多内存并复制数据。 当然,如果您知道(估计)您需要的内存分配的大小,您可以预先分配它并避免复制。

但是请注意,C 中的结构在声明后具有固定大小,因此您似乎不需要为现有结构分配更多内存...

【讨论】:

    【解决方案3】:

    realloc是扩展现有动态内存的唯一方法。 realloc 将尝试扩展现有缓冲区,如果扩展失败,它将为所需的总大小分配新缓冲区,并从旧缓冲区复制数据。如果您不想每次都执行realloc(大部分时间在内部将memmove),那么您可以尝试重新分配比实际需要更多的内存。

    realloc(buf_ptr, (actual_size + additional_size) * 2);

    这种方式会减少调用realloc(和memmove)的频率。

    注意:realloc 的实现在某些架构中是不同的,它永远不会尝试扩展内存,它总是尝试为总大小分配缓冲区。因此,在这些平台中,每次调用 realloc 都会调用 memmove

    【讨论】:

      【解决方案4】:

      听起来您正在寻找名为灵活数组成员 (example) 的C 功能。它仅适用于 C 标准 C99 或更高版本。

      结构的最后一个成员必须被声明为一个灵活的数组成员,你最初是 malloc,然后是 realloc(当然还有 memcpy 来进行实际的复制)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-02
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 2013-01-18
        • 2015-10-12
        相关资源
        最近更新 更多