
Linux 类操作系统提供了很多内存分配机制。这些常用机制都有各自适合的使用场景。
本文将重点介绍一下 alloca() 函数及相关用法。
文章最后并提供一份与 malloc() 内存分配机制的对比,方便读者选择最适合的内存机制。
alloca() 是一个基于栈进行内存分配的函数。
#include <alloca.h>该函数成功时,会返回一个指向 size 字节大小的内存指针。这块内存是在栈中的。所以,从函数返回时,它会被自动释放。失败时(size 过大),可能会存在栈溢出问题(可能会指向堆区或者其它区域)。
如下所示,我们希望实现一个自定义版本的 performSelector:
withArguments 参数数组NSNumber 自动进行解包 unbox。@implementation NSObject (My_perform)输出如下:
9223372036854775807  2147483647  1  c我们重点看一下 malloc() 函数的位置。很明显,每次申请 buffer 后,都需要调用 free 函数,才能避免内存泄露。
void *buffer = malloc(bufferSize);替换成 alloca() 版本后,如下:
void *buffer = alloca(bufferSize);很明显,第二种写法更加的简洁。并且考虑到 malloc() 是通过堆区申请内存,alloca() 耗时会明显降低很多。
两种分配方式的对比:
| 分配方式 | 优点 | 缺点 | 
|---|---|---|
| malloc() | 简单,方便,最常用 | 返回的内存为零初始化(有额外耗时) | 
| alloca() | 最快的分配方式,对于小的分配非常合适 | 不能返回错误信息,不适合大的分配 | 
iOS