Objective-C 程序内存分布

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

内存分布

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

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

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

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

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

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

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

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

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

//代码为前辈所有
//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,当然也存储在不同区域。堆中的内存需要我们手打创建和释放,相比较其他都是系统创建很释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值