C管理函数临时动态内存的有效方法

时间:2014-04-03 12:16:44

标签: c memory-management dynamic-memory-allocation

我正在制作一个非确定性有限自动机(NFA)。 NFA有一组状态,我需要四个具有相同大小(NFA中的状态数)的数组,以便在模拟NFA期间记录有关状态的临时信息。

然而,不同的NFA具有不同的状态数,因此阵列的大小随着不同的NFA而变化。

使用C我已经提出了三种处理内存分配的方法:

  1. 使用非常大的固定大小的数组。

  2. 每次调用函数时动态malloc memroy,在函数完成之前,释放已分配的内存

  3. 使用malloc但不在每个函数调用上分配内存,使用四个静态指针变量和一个static int arraySize来记录分配的数组大小,这是第一次调用函数时,分配大小为NFA的数组 - > numStates并分配给每个静态指针,将NFA-> numStates赋值给static int arraySize;第二次,如果NFA-> numStates小于或等于arraySize,则没有内存分配;如果NFA-> numStates大于arraySize,则释放前面的内存和realloc数组,大小为NFA-> numStates。

  4. 方法1使用固定大小的数组,这意味着当输入NFA-> numStates大于硬编码数组大小时,该函数将无法工作。

    方法2是可适应的,但每次调用函数时都需要分配内存,效率不高?

    方法3也适用,但是很复杂,并且不是线程安全的吗?

    建议或其他替代方案?

3 个答案:

答案 0 :(得分:0)

选项2如何使用alloca(),即在堆栈上分配?它比malloc()快得多,并且当您离开范围时会自动解除分配,这听起来就像您想要的那样。

当然,它不是标准版或便携版,因此可能不适合您。

如果做不到这一点,一个大的固定大小的数组看起来很容易,而且不会占用更多的内存。

答案 1 :(得分:0)

自C99以来,

Variable-Length Array(VLAs)已经可用。如果您仍在使用不支持此类操作的实现,我会留下深刻的印象。 VLA的工作方式与常规数组类似,只是在运行时确定用于声明它们的大小。这似乎是你正在寻找的。

答案 2 :(得分:0)

当你处理任意大小的数组时,我建议你实现简单的链表结构,它在初始化时将保存一个预定义大小的数组,并且可以扩展以容纳更多的内存块。这将是对连续内存空间的抽象。您只需要将此结构的当前大小存储在父容器中。

#include <stddef.h>

struct contmem
{
        size_t size;
        struct memchunk
        {
                void *data;
                struct memchunk *next, *prev;
        } head;
}

因此,当您必须通过迭代链表的元素来存储信息时,可以扩展此结构。这与标准C ++库中的列表内部发生的情况类似,与直接内存重新分配不同。