Objective-C内存布局

第2章 C变量

当用大多数常见的脚本编程语言编写一个程序时,几乎不必花时间来考虑变量。只是在使用变量时才创建它们,并且不必担心用完它们之后会发生些什么。语言的解释器会负责所有的细节。

当你在编译语言中编写代码时,事情就没那么简单了。必须告诉编译器每个变量的类型和名称,以声明任何将要在程序中使用的变量。编译器随后查看变量的声明类型,为其保留相应数目的字节,并且将变量名与这些字节关联起来。

本章我们将介绍Objective-C中变量声明的形式,以及编译器如何存储各种不同的变量。

2.1 Objective-C程序的内存布局

要理解本章的内容,就要知道Objective-C程序是如何管理内存的。图2-1给出了运行程序的虚拟地址空间的一个简图。



注意 虚拟地址空间是程序“看到的”地址空间。虚拟地址空间和实际的物理地址空间之间的转换,由操作系统和计算机的内存管理单元(Memory Management Unit,MMU)隐式地进行。

按照虚拟地址从低向高的顺序:

文本段包含了程序的可执行代码和只读的数据。

数据段包含了可读写的数据,包括全局变量。

堆包含了根据请求分配给程序的内存块(参见本章稍后的2.6节)。当需要更多内存时,系统可能会向上扩展堆。

栈用于调用者函数。当调用一个函数时,系统为被调用的函数构建一个栈帧。栈帧是在栈的底部(最低的地址)构建的一个内存区域。栈指针(它指向栈的最低位置的地址)向下移动。栈帧包含了用于被调用函数的参数和局部变量的空间,以及用来保存在函数调用的过程中需要保存的任何寄存器的值的空间,还有用于一些控制信息的空间。当函数返回时,栈指针恢复到其最初的值(较高的地址),并且控制返回给调用者函数。关于这一过程,需要记住的重要的一点是,当函数返回之后,其栈帧的内容就不再有效了。

注意 一些人喜欢把栈看做是向上扩展的,类似于桌面上物理地堆放着的一摞纸。他们说栈的指针指向“栈的顶部”。尽管可以这么考虑,但是,栈在内存地址中是向下递增的。调用一个函数会将栈指针向一个较低的地址移动,并且,从函数返回则会将栈指针移回到一个较高的地址。


From:http://book.51cto.com/art/201102/245575.htm

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值