我正在制作一个非确定性有限自动机(NFA)。 NFA有一组状态,我需要四个具有相同大小(NFA中的状态数)的数组,以便在模拟NFA期间记录有关状态的临时信息。
然而,不同的NFA具有不同的状态数,因此阵列的大小随着不同的NFA而变化。
使用C我已经提出了三种处理内存分配的方法:
使用非常大的固定大小的数组。
每次调用函数时动态malloc memroy,在函数完成之前,释放已分配的内存
使用malloc但不在每个函数调用上分配内存,使用四个静态指针变量和一个static int arraySize来记录分配的数组大小,这是第一次调用函数时,分配大小为NFA的数组 - > numStates并分配给每个静态指针,将NFA-> numStates赋值给static int arraySize;第二次,如果NFA-> numStates小于或等于arraySize,则没有内存分配;如果NFA-> numStates大于arraySize,则释放前面的内存和realloc数组,大小为NFA-> numStates。
方法1使用固定大小的数组,这意味着当输入NFA-> numStates大于硬编码数组大小时,该函数将无法工作。
方法2是可适应的,但每次调用函数时都需要分配内存,效率不高?
方法3也适用,但是很复杂,并且不是线程安全的吗?
建议或其他替代方案?
答案 0 :(得分:0)
选项2如何使用alloca()
,即在堆栈上分配?它比malloc()
快得多,并且当您离开范围时会自动解除分配,这听起来就像您想要的那样。
当然,它不是标准版或便携版,因此可能不适合您。
如果做不到这一点,一个大的固定大小的数组看起来很容易,而且不会占用更多的内存。
答案 1 :(得分:0)
Variable-Length Array(VLAs)已经可用。如果您仍在使用不支持此类操作的实现,我会留下深刻的印象。 VLA的工作方式与常规数组类似,只是在运行时确定用于声明它们的大小。这似乎是你正在寻找的。 p>
答案 2 :(得分:0)
当你处理任意大小的数组时,我建议你实现简单的链表结构,它在初始化时将保存一个预定义大小的数组,并且可以扩展以容纳更多的内存块。这将是对连续内存空间的抽象。您只需要将此结构的当前大小存储在父容器中。
#include <stddef.h>
struct contmem
{
size_t size;
struct memchunk
{
void *data;
struct memchunk *next, *prev;
} head;
}
因此,当您必须通过迭代链表的元素来存储信息时,可以扩展此结构。这与标准C ++库中的列表内部发生的情况类似,与直接内存重新分配不同。