我需要以大块的形式获取堆内存。并且这些内存块将用作内存池,并且在进程退出之前不会释放。
因此,传统的malloc
可能不像我想的那么简单(也不快)。
我认为,类似堆栈的分配(LIFO)比malloc
更有效。
现有的图书馆可以做到吗? 或者我应该为此目的写一个新的?
PS:我猜obstack
最能说明我在说什么。关于obstack
的任何其他候选人或介绍?
答案 0 :(得分:1)
听取其他人的意见,首先要有效地使用malloc
,但是如果你确实需要一个基于区域的分配器,可以释放大块的东西,请查看Apache Portable Runtime库。
答案 1 :(得分:0)
来自Wikipedia:
在C中,库函数malloc用于在堆上分配一块内存。
malloc
会非常简单快捷。
另外,这是什么意思?
我认为将堆内存分配视为堆栈的方式是可以的。
如果您的意思是想要为内存池使用堆栈空间,那么您会感到很失望。堆栈通常只有几MB(精确的大小取决于机器和?编译器)。也许你有你的堆栈和堆倒退的想法?堆栈是带有参数和局部变量的函数框架;堆是持久的动态分配内存的地方。
答案 2 :(得分:0)
malloc
会在一次又一次地调用时导致减速,就像在三重嵌套循环中间一样。如果您使用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
只运行一次。