Linux C提供了在栈中动态分配内存的函数alloca
,用法和malloc
一样,但不用free
,因为他是在栈中分配空间,超出定义域后自动释放
实现原理:修改堆栈指针指向即可
使用场景
需要频繁的分配释放小块内存
生命周期短暂
需要在程序运行时才能确定对象的大小
函数原型
#include <alloca.h>
void *alloca(size_t size);
使用示例
int lenght = 10;
char* str = (char*)alloca(length * sizeof(char));
优点
使用 alloca()来分配内存相对于 malloc()有一定优势。其中之一是,alloca()分配内存的速度要快于 malloc(),因编译器将 alloca()作为内联代码处理,并通过直接调整堆栈指针来实现。此外,alloca()也不需要维护空闲内存块列表。 另一个优点在于,由 alloca()分配的内存随栈帧的移除而自动释放,亦即当调用 alloca 的函数返回之时。之所以如此,是因为函数返回时所执行的代码会重置栈指针寄存器,使其指向前一帧的末尾(即,假设堆栈向下增长,则指向恰好位于当前栈帧起始处之上的地址)。由于在函数的所有返回路径中都无需确保去释放所有的已分配内存,一些函数的编码也变得简单得多。
在抛出异常以及信号处理程序中调用 longjmp()或 siglongjmp()以执行非局部跳转时,alloca()的作用尤其突出。此时,在“起跳”函数和“落地”函数之间的函数中,如果使用了 malloc()来分配内存,要想避免内存泄漏就极其困难,甚至是不可能的。与之相反,alloca()完全可以避免这一问题,因为堆栈是由这些调用展开的,所以已分配的内存会被自动释放
使用注意项总结
- 该函数不是跨平台的
- 由于在栈中进行分配,所以分配速度快,
- 适合小块内存,如果分配大块内存可能会导致栈溢出
- 不会返回错误信息
- 由于是栈内存,所以不需要自己进行释放
- 在抛出异常时不需要对内存释放处理也能自动的释放内存