用栈实现内存分配:alloca方法详解
最编程
2024-02-12 13:00:30
...
前言
Linux 类操作系统提供了很多内存分配机制。这些常用机制都有各自适合的使用场景。
本文将重点介绍一下 alloca()
函数及相关用法。
文章最后并提供一份与 malloc()
内存分配机制的对比,方便读者选择最适合的内存机制。
基于栈的内存分配 —— alloca
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
推荐阅读