是否有一个库或一个malloc实现,它将堆上的内存分配给/像堆栈一样?

问题描述:

我需要在大块中获得堆内存。这些内存块将用作内存池,并且在进程退出之前不会被释放。 因此,传统的malloc可能并不像我想要的那么简单(也不如此快)。 我认为,堆栈式分配(LIFO)会比malloc更有效率。是否有一个库或一个malloc实现,它将堆上的内存分配给/像堆栈一样?

有没有现有的库可以做到这一点? 或者我应该为此写一个新的吗?

PS:我猜obstack最能说明我在说什么。任何其他候选人或介绍obstack

+7

你在你的问题中做了几个毫无根据的假设 - 只是使用普通的malloc调用内存分配,一切都会正常工作。 (如果它没有出于某种原因,那么你可以随时替换malloc实现。) –

+1

在你跳得太远之前,你是否尝试过一些其他的malloc实现?例如。 'tcmalloc'? –

+0

'堆内存分配作为堆栈的方式'你是什么意思? – Gautam

Wikipedia来自:

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

malloc将会非常简单和快速。

另外,这是什么意思?

我认为可以将堆内存分配视为堆栈方式。

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

+0

谢谢你的回答。我的意思是说,我想从堆中分配一个FILO内存,堆栈中的内存分配给FILO,不是吗? – Nogard

+0

是的,堆栈是FILO。如果不知道更多关于你想要做什么的内容,那么很难做出更具体的建议,但是如果你知道你需要的最大堆栈大小,你可以'malloc'一次,并保留一个指向末尾的指针 – Kevin

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只运行一次。

+0

我同意,并且经常调用'malloc'和'free'也可能导致大量的分段块,因为空闲块通过空闲列表连接。但是,这是问题所在。是否有可能减少列表的开销?类似堆栈的分配可能更有效。 – Nogard

倾听其他人的说法,首先要有效地使用malloc,但如果您确实需要基于区域的分配器,可以将大量的东西释放出来,请查看Apache便携式运行时库。