打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Objective-C 程序内存分布
userphoto

2017.05.10

关注

Objective-C程序内存分布:程序在运行中会占用内存,一般内存中分为堆区,栈区,代码区等那么Objective-C的内存分布又是什么样的呢?

内存分布

我们查看内存分布是我们可以通过打印内存地址比如说堆和栈,他们的内存地址相距就非常非常远,我们通过下面的图片来了解内存程序运行时内存的分布情况。

全局区:存放全局变量和常量

非初始化(bss):存放没有被初始化或初始化为0的全局变量;

初始化(data): 初始化过的全局变量数据,用来保存初始化了的非0的全局变量 ;

文字常量区(rodata):存放常量数据;

程序代码区(text):用来存放程序的代码(如函数)和部分整数常量是可以执行的不被共享;

栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放;

堆区(heap):由程序创建和释放,相对自由一片区域,没有大小限制,采用链表形式管理;

查看下方代码查看分布情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//代码为前辈所有
//main.cpp
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);
    p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区
    strcpy(p1, "123456"); // 123456\0在常量区,这个函数的作用是将"123456" 这串字符串复制一份放在p1申请的10个字节的堆区域中。
    // p3指向的"123456"与这里的"123456"可能会被编译器优化成一个地址。
}

上一篇中提到Block对应不同类型的Block,当然也存储在不同区域。堆中的内存需要我们手打创建和释放,相比较其他都是系统创建很释放。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
07 内存变量 存储
堆和栈的概念 (转载)
(1)C和C++内存模型
单片机的内存和寄存器是什么?代码中的变量和内存之间有什么关系?
c++和c程序的内存分派
【C】C的编译器对内存空间的分配
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服