前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于栈的内存分配 —— alloca

基于栈的内存分配 —— alloca

作者头像
酷酷的哀殿
发布2020-10-26 10:16:20
4.4K0
发布2020-10-26 10:16:20
举报
文章被收录于专栏:酷酷的哀殿

前言

Linux 类操作系统提供了很多内存分配机制。这些常用机制都有各自适合的使用场景。 本文将重点介绍一下 alloca() 函数及相关用法。 文章最后并提供一份与 malloc() 内存分配机制的对比,方便读者选择最适合的内存机制。

基于栈的内存分配 —— alloca

alloca() 是一个基于栈进行内存分配的函数。

代码语言:javascript
复制
#include <alloca.h>

该函数成功时,会返回一个指向 size 字节大小的内存指针。这块内存是在栈中的。所以,从函数返回时,它会被自动释放。失败时(size 过大),可能会存在栈溢出问题(可能会指向堆区或者其它区域)。

如下所示,我们希望实现一个自定义版本的 performSelector:

  • 该方法接受一个withArguments 参数数组
  • 能够将 NSNumber 自动进行解包 unbox
代码语言:javascript
复制
@implementation NSObject (My_perform)

输出如下:

代码语言:javascript
复制
9223372036854775807  2147483647  1  c

我们重点看一下 malloc() 函数的位置。很明显,每次申请 buffer 后,都需要调用 free 函数,才能避免内存泄露。

代码语言:javascript
复制
void *buffer = malloc(bufferSize);

替换成 alloca() 版本后,如下:

代码语言:javascript
复制
void *buffer = alloca(bufferSize);

很明显,第二种写法更加的简洁。并且考虑到 malloc() 是通过堆区申请内存,alloca() 耗时会明显降低很多。

两种分配方式的对比:

分配方式

优点

缺点

malloc()

简单,方便,最常用

返回的内存为零初始化(有额外耗时)

alloca()

最快的分配方式,对于小的分配非常合适

不能返回错误信息,不适合大的分配

iOS

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 酷酷的哀殿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 基于栈的内存分配 —— alloca
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档