基于栈的内存分配 —— alloca

时间:2022-07-28
本文章向大家介绍基于栈的内存分配 —— alloca,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

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