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