Fork me on GitHub

浅谈计算机内存分配

C语言

名称 内容 特性
栈区(stack) 栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。后进先出(LIFO);栈是逆向生长,先进栈的所分配的内存空间地址更大。
堆区(heap) 堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。先进先出(FIFO);堆是顺序生长,先进栈的所分配的内存空间地址更小。
数据区 全局非静态区、全局静态区、局部静态区、常量区 数据区主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区; 数据区全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后有系统释放;常量字符串就是放在常量区。程序结束后由系统释放。

注:对于指针指向的所分配的某一块内存(无论是堆还是栈)的首地址永远是这块内存中最小的。

iOS

名称 内容 特性
栈区(stack) 存放的局部变量、先进后出、一旦出了作用域就会被销毁;函数跳转地址,现场保护等;程序猿不需要管理栈区变量的内存;栈区地址从高到低分配。
堆区(heap) 全局区非静态区、全局静态区、局部静态区 堆区的内存分配使用的是alloc;需要程序猿管理内存;ARC的内存的管理,是编译器再编译的时候自动添加retain、release、autorelease;堆区的地址是从低到高分配。
全局区/静态区(static) 全局区/静态区(static)包括两个部分:未初始化过 、初始化过;也就是说,(全局区/静态区)在内存中是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域;eg:int a;未初始化的。int a = 10;已初始化的。
常量区 常量字符串就是放在常量区。
代码区 代码区存放App二进制代码。
- END -
关注微信公众号,发现更多精彩

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际