iOS数据存储类型 及 堆(heap)和栈(stack)

Unity引擎底层架构与核心模块深度解析:从内存管理到渲染管线 游戏引擎是现代游戏开发的核心框架,负责协调图形渲染、物理模拟、内存管理与脚本执行等关键任务。其底层架构设计直接决定了应用的性能上限与跨平台能力。以Unity引擎为例,其经典的三层架构模型(核心层、中间层、应用层)通过清晰的职责分离,实现了高效的资源调度与平台抽象。理解内存管理机制,特别是托管堆与原生堆的交互及垃圾回收策略,是解决性能瓶颈和内存泄漏的基础。渲染管线作为图形处理的核心,其数据流(如剔除、排序、合批)的优化直接影响GPU的绘制效率。掌握这些底层原理,对于进行高级图形编程、性能调优以及实现定制化渲染 阅读详情

一般认为在c中分为这几个存储区:

1栈 --  由编译器自动分配释放。
2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
3全局区(静态存储区)-- 全局变量和静态变量的存储是放在一块区域 ,程序退出后自动释放 。全局区又分为全局初始化区和全局未初始化区。初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域。

4常量区-- 专门放数字/字符常量的地方, 程序退出后自动释放 。

在函数体中定义的自动变量通常是在栈上,

用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。

加了static修饰符后不管在哪里都存放在全局区(静态存储区)。

在所有函数体外定义的是全局变量,存储在全局区(静态存储区),在整个C程序所有源文件中通过extern声明后都可用。

在所有函数体外定义的static全局变量存储在全局区(静态存储区),只在该文件中有效,不能extern声明到别的文件用。

在函数体内定义的static静态变量存储在全局区(静态存储区),表示只在该函数体内有效,但是其生命周期却变为和整个程序同生同死。

另外,函数中的"adgfdf"这样的字符串存放在常量区。 

代码: 
int a = 0; //全局初始化区 
char *p1; //全局未初始化区 
main() 
{ 
int b; //栈 
char s[] = "abc"; //栈 
char *p2; //栈 
char *p3 = "123456";  //123456\0在常量区,p3在栈上。 
static int c = 0; //全局(静态)初始化区 
p1 = (char *)malloc(10);   //分配得来的10 字节的区域就在堆区。 
p2 = (char *)malloc(20);  //分配得来的 20字节的区域就在堆区。 
strcpy(p1, "123456");   //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。 
} 


函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,VC的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太 深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。 


堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。 并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而使用栈则不会产生碎片。

 
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap。在栈上存取数据比通过指针在堆上存取数据快些。 栈是先入后出的,一般是由高地址向低地址生长。 


堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。

栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。 
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。 
这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支持的数据类型,并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序中是非常频繁的。

 C/C++中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因。 

和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。 
基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存空间时,这套函数首先试图从内部堆中寻找可用的内存空间,如果没有可以使用的内存空间,则试图利用系统调用来动态增加程序数据段的内存大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形式返回给调用者。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会被适当的处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这套复杂的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若干原因: 

1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。 

2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。 

3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。 


堆和栈的对比 

从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。

 

栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间 
分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的 
动态分配操作是不被鼓励的!

 

堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。


原文链接: http://www.cnblogs.com/stevenwuzheng/p/5298020.html

Unity GC性能优化实战:从原理到工具,彻底解决游戏卡顿与内存问题 在游戏开发中,内存管理是影响性能的关键因素,而垃圾回收机制则是其核心组成部分。GC通过自动回收不再使用的内存来防止内存泄漏,但其回收过程会占用CPU时间,可能导致程序卡顿。在Unity开发中,理解GC的工作原理对于优化性能至关重要,尤其是在处理高频数据交互和动态资源生成时。通过分析GC的触发机制和内存分配模式,开发者可以采取有效的优化策略,如使用对象池和避免不必要的内存分配,从而提升游戏的流畅度。本文聚焦于Unity中的GC问题,探讨如何通过工具定位和代码优化来解决常见的性能瓶颈,特别是在移动端开发中,如处 阅读详情

相关推荐

HBuilderX与uni-app跨平台开发实战指南

跨平台开发框架通过统一代码库实现在多个平台上的应用部署,其核心原理是将通用代码编译为各平台原生代码。uni-app作为基于Vue.js的跨平台解决方案,结合HBuilderX IDE工具,显著提升了开发效率。在技术实现上,uni-app采用'编译时+运行时'架构,编译阶段生成平台特定代码,运行时提供统一JavaScript API接口。这种模式特别适合需要快速迭代的中小型项目,如毕业设计和创业原型开发。通过HBuilderX的环境配置、uni-app的组件化开发和平台特定功能调用,开发者可以轻松实现'一次编

benben 402

IOS-堆、栈总结

IOS 堆、栈的使用与区别数据结构内存管理堆、栈的区别管理方式体型、性能存储内容参考 数据结构 堆、栈是两种数据结构。 栈是一种线性的数据结构,存储和访问数据时,都只能访问栈的一端。数据访问为 FILO(先进后出)。 堆是一种特殊的二叉树,(最大堆)具有以下两个性质: 每个节点的值 >= 其每个子节点的值。 树完全平衡(任意节点的左右子树的高度差值 <= 1),最后一层的叶子节点都位于最左侧。 堆可以用树(指针节点)来实现,也可以用数组来实现: 注:可以看到,数据结构中的堆维护了一个较为复杂

weixin_43536737的博客 1955

CTF逆向工程入门:从核心思维到实战工具链全解析

逆向工程是理解程序在未公开源代码情况下的内部逻辑与行为的关键技术,其核心原理在于通过静态与动态分析手段,还原软件的执行流程与数据变换过程。这项技术的价值在于能够深入剖析软件工作机制,广泛应用于软件安全分析、漏洞挖掘、恶意代码检测等领域。在网络安全竞赛(CTF)中,逆向工程更是解题的核心技能之一,参赛者需通过分析二进制文件,理解其验证逻辑,从而找到隐藏的flag。本文聚焦于CTF逆向的实战入门,系统拆解了以‘运行观察、静态分析、动态调试、验证猜想’为核心的通用解题流程,并详细介绍了包括IDA Pro、Ghid

weixin_30463341的博客 322

【iOS内存管理-内存的几大区域】

栈是从高地址向低地址存储的一块连续的内存区域,特点是先进后出(FILO)栈的地址空间在在iOS里面是0X7/ 0X16开头栈区一般是在运行时分配内存,内存空间由系统管理,也就是变量在超出了自身的作用范围之后就会被释放。包含函数内部定义的局部变量以及方法参数(方法的默认参数 self,cmd)等也都是存放在栈区。初步了解了iOS的内存区域,主要是栈和堆的区别和联系需要我们了然于心。

weixin_61639290的博客 1551

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4022

Objective-C基本数据类型范例

这个代码包含了对int,float,double以及char这四种基本数据类型的输出展示。更多博文资料,请参阅苹果开发者新浪博客http://blog.sina.com.cn/macdev

iOS 内存管理 堆和栈 的理解

非OC对象一般放在栈里面(栈内存会被系统自动回收)OC对象存放于堆里面(堆内存要程序员手动回收)

weixin_57657187的博客 180

快速玩转 Llama2!机器学习 PAI 最佳实践(一)—低代码 Lora 微调及部署

本实践将采用阿里云机器学习平台PAI-快速开始模块针对 Llama-2-7b-chat 进行开发。PAI-快速开始支持基于开源模型的低代码训练、布署和推理全流程,适合想要快速开箱体验预训练模型的开发者。

阿里云云栖号 1765

iOS-基础-数据类型

oc数据类型 数据类型:基本数据类型、指针数据类型 基本数据类型:数值型、字符型(char)、布尔型、空类型(void) 指针数据类型:类(class)、id 数值型:整数类型int、浮点型float、double c和oc的基本数据类型 int:声明整型变量 double:声明双精度变量 float:声明浮点型变量 char:声明字符型变量 id:通用的指针类型 enum:声明枚举类型 long:声明长整型变量或函数 short:声明短整型变量或函数 signed:声明有符号类型变量 struct:声明结

icewst的专栏 952

SCS 43. 利用Scissor算法从单细胞数据中挖掘临床表型关联的细胞亚群

本文详细介绍了Scissor算法在单细胞转录组数据分析中的应用,该算法能够精准挖掘与临床表型关联的细胞亚群。通过建立单细胞RNA测序数据与临床预测模型的直接关联,Scissor避免了传统聚类方法的局限性,为疾病机制研究和个性化医疗提供了新工具。文章还涵盖了数据预处理、模型选择、结果验证等实战技巧。

weixin_28736335的博客 490

Ecg信号QRS波峰检测:A Real-Time QRS Detection Algorithm (Pan-Tompkins法)

Pan-Tompkins法是R峰检测的经典方法,被引量高达6000+次。 Pan J, Tompkins W J. A real-time QRS detection algorithm[J]. IEEE transactions on biomedical engineering, 1985 (3): 230-236. 本文对论文流程进行了总结,并参考BioSigKit项目,复现了论文代码。 流程图: 代码如下: 第一部分是信号读入,这里使用MIT_BIH信号的100,读入10000个数据点 第二部分

weixin_42870380的博客 1万+

堆栈的深入个人理解

原文地址:http://www.51hei.com/mcu/3799.html 对于堆,栈,堆栈的味道,一直就跟猪八戒吃啥来着,从没有细细地品尝过。发了下狠心,各个网页看了很多,这里就把我东抓西拼的东西整理整理。   一  这些个概念怎么来的以及怎么记得住 这里,只限于整理我个人对堆/栈/堆栈在内存管理方面的理解。其他,在数据结构方面讲的堆/栈目前不在我整理范围之内。 这

zhangzker的博客 762

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1389

JVM-内存结构

内存结构图 Heap,Method Area内存可由GC回收。JVM调优针对Heap与Mehtod Area。 Stack, PC Register, Native Method Stack内存由JVM分配和回收,使用之后JVM自动释放空间。不存在已使用的变量,因为已经被JVM释放。只存在当前使用以及将来即将使用的变量。 Stack (Java 虚拟机栈) Java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占中。Demo1.class执行后,有2个方法栈(Demo

A_bad_horse的专栏 187

实现 PDF 添加水印的五种方式

PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。

逸轩 6471

用户画像标签维度_搭建电商平台用户画像标签体系

01 整体思路电商平台连接了卖家和买家两端,最终目的都是促进交易,从而追求更高的销售额。提高人货匹配度是促进交易的关键,而提高人货匹配度的关键就是“让买家找到想要的货物”。本文结合“人、货、场”理论模型,尝试建立电商平台的用户画像标签体系。02 三类标签用户在平台购物的整体流程可以概括为:进入平台、选择商品、下单付款。可以将该过程抽象为“人、货、场”。即用户通过什么途径进入什么商品的页面...

weixin_31668621的博客 1641

iOS备份数据深度解析:使用iBackup Extractor高效提取应用文件实战指南

在iOS设备数据管理中,iBackup Extractor作为一款专业的开源工具,能够从iOS备份档案中精确提取文件,解决iOS备份文件无法直接访问的技术难题。本文将深入探讨iOS备份结构原理,并提供完整的iBackup Extractor使用指南,帮助开发者和技术用户高效恢复重要数据。 ## iOS备份文件的隐藏结构与技术挑战 iOS备份采用独特的数据存储机制,所有应用文件都被重新命名为40

gitblog_00248的博客 323

uniapp(全端兼容) - 最新详细实现双色球开奖走势图功能组件,uni-app红球走势图/蓝球走势图,解决双色球 “蓝球连线“ 问题,双色球效果及用线连接每个号码详细教程(同样适用于彩票开奖走势图

uni-app,双色球,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,红球走势,蓝球走势,连线,uniapp(vue):js实现双色球开奖走势图带连线,vue2,vue3,uniApp双色球组件插件,uniapp如何实现双色球走势图和连线,彩票走势图,前端 Vue实现彩票走势图,详细示例,走势图,彩票项目,绘制股票走势图,前端 JS实现彩票开奖走势图 连线,Uniapp有没有双色球的页面代码,红球蓝球的走势图如何做,双色球红球和值尾走势图,

✅ 精选推荐文章 3344

Unity C#基本数据类型深度解析:int、float、string、bool实战指南

在C#编程与Unity游戏开发中,数据类型是构建所有逻辑与功能的基石。理解值类型与引用类型的核心原理,关乎数据在内存中的存储、传递方式及程序性能。int、float、bool等值类型直接存储数据,运算高效,是游戏计数、状态与物理计算的支柱;而string等引用类型涉及堆内存分配与垃圾回收(GC),不当使用易引发性能卡顿。掌握类型转换、浮点数精度处理以及字符串优化等工程实践,对于开发稳定、高效的Unity应用至关重要。本文将聚焦Unity环境下int、float、string、bool四种基本数据类型的特性、

weixin_34216196的博客 336

SAP 固定资产采购简介

SAP 固定资产采购是指企业通过采购流程获取长期使用并记录为固定资产的物品。固定资产是企业为长期使用而购置的资产,如机器设备、办公设备、建筑物、车辆等,通常这些资产的使用期限较长,并且在资产负债表上记录。在SAP系统中,固定资产采购流程通常与物料管理(MM)模块和固定资产管理(FI-AA)模块相结合。这个过程涉及从需求的提出、采购订单的创建,到货物接收、发票校验和资产激活的多个步骤。

我小时候很黑的博客 1727

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Xcode的诊断配置

Xcode的scheme配置中,有个Diagnostics栏目,其中有很多内存相关的配置,用来帮助开发者定位内存问题。常用的功能有这些。 Address Sanitizer Guard Malloc Zombie Objects Malloc Scribble Maloc Guard Edges Malloc Stack LoggingAddress Sanitizer,地址消毒剂 Guard Malloc Malloc Scribble,将分配的内存填充0xAA(通过malloc调用的,calloc不会填

勿在浮沙筑高楼 1299

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JAVA面试题(1~95)《上》

1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性...

ywl470812087的博客 4963

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

超越Hello World:用Nios II与JTAG UART打造交互式嵌入式调试系统

本文深入探讨如何利用Nios II软核处理器与JTAG UART构建高效的交互式嵌入式调试系统,超越基础应用。详细介绍了系统架构设计、中断驱动机制、高级调试功能实现及优化策略,为复杂嵌入式开发提供强大的实时监控和调试能力,显著提升开发效率和系统可靠性。

mqtt6iot的博客 929

Golang基础面试题汇总

channel、goroutine、slice、map、反射、内存、GC、Musql、Redis、ELK、K8s、Http、Https

weixin_41760738的博客 5696

面试题kkk

这篇文章摘要主要涵盖了Android开发中的核心知识点和技术难点,包括数据结构、Java与Kotlin语言特性、多线程与并发、内存管理、安卓组件与UI、IPC通信、数据库、多媒体处理、设计模式、性能优化、跨端开发等多个方面。文章详细解析了常见数据结构的使用与实现、JVM机制、内存泄漏分析与解决方案、Activity生命周期、事件分发机制、Handler原理、音视频处理、设计模式应用等核心内容,并提供了实际项目中的技术卡点与解决方案。此外,还涉及了性能优化策略、跨端开发差异、技术方案设计思路以及Git常用命令

mix39的博客 928
上一篇: 为什么NSMutableArray必须用strong,而NSArray必须用copy?
下一篇: 怎么判断两个IP在同一个局域网?
lin_transform
博客等级 码龄9年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值