是否有一个库或一个malloc实现,它将堆上的内存分配给/像堆栈一样?
我需要在大块中获得堆内存。这些内存块将用作内存池,并且在进程退出之前不会被释放。 因此,传统的malloc
可能并不像我想要的那么简单(也不如此快)。 我认为,堆栈式分配(LIFO)会比malloc
更有效率。是否有一个库或一个malloc实现,它将堆上的内存分配给/像堆栈一样?
有没有现有的库可以做到这一点? 或者我应该为此写一个新的吗?
PS:我猜obstack
最能说明我在说什么。任何其他候选人或介绍obstack
?
Wikipedia来自:
在C中,库函数malloc用于在堆上分配的内存块。
malloc
将会非常简单和快速。
另外,这是什么意思?
我认为可以将堆内存分配视为堆栈方式。
如果你的意思是你想为你的内存池使用堆栈空间,你会感到失望。堆栈通常只有几MB(精确的大小取决于机器和编译器)。也许你有你的想法堆栈和堆倒退?堆栈是函数框架,其中有参数和局部变量,堆是持久的,动态分配的内存去的地方。
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
只运行一次。
我同意,并且经常调用'malloc'和'free'也可能导致大量的分段块,因为空闲块通过空闲列表连接。但是,这是问题所在。是否有可能减少列表的开销?类似堆栈的分配可能更有效。 – Nogard
倾听其他人的说法,首先要有效地使用malloc
,但如果您确实需要基于区域的分配器,可以将大量的东西释放出来,请查看Apache便携式运行时库。
你在你的问题中做了几个毫无根据的假设 - 只是使用普通的malloc调用内存分配,一切都会正常工作。 (如果它没有出于某种原因,那么你可以随时替换malloc实现。) –
在你跳得太远之前,你是否尝试过一些其他的malloc实现?例如。 'tcmalloc'? –
'堆内存分配作为堆栈的方式'你是什么意思? – Gautam