基于栈的内存分配 —— 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
- javascript设计模式 -- 工厂模式
- Google VR技术大揭秘
- Android入门之数据传递
- Swift 3.0介绍
- C++判断char*的指向
- Linux基础(day18)
- Spring Boot搭建Web应用
- 5.7 vim实践
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- 2.3 ls命令
- Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaWeb--简单分页技术
- 使用Python制作第一个爬虫程序
- 使用BeautifulSoup 爬取一个页面上的所有的超链接
- 使用PlaceHolder,测试碰见的问题
- 隐藏MySQL InnoDB Cluster / ReplicaSet实例
- MySQL8.0.21——错误日志中的组复制系统消息
- 【一】、搭建Hadoop环境----本地、伪分布式
- 在组复制中指定恢复IP地址
- START GROUP_REPLICATION可以将恢复凭据作为参数
- MySQL Shell转储和加载第1部分:演示!
- MySQL Shell转储和加载第2部分:基准测试
- MySQL Shell转储和加载第3部分:加载转储
- Hadoop【单机安装-测试程序WordCount】
- MySQL Shell转储和加载第4部分:转储实例和模式
- 【创建模式】--工厂模式