0

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

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

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

4

4 回答 4

5

您可能可以使用realloc().

于 2013-01-22T08:56:41.130 回答
3

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

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

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

于 2013-01-22T08:56:33.050 回答
0

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

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

于 2013-01-22T09:56:54.393 回答
0

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

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

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

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

于 2013-01-22T09:55:12.473 回答