今天,我们来讲讲对象类型在内存中的分配!
对象类型和整型、字符串等类型一样,也是PHP中的一种数据类型,在程序中存储不同类型的数据,在程序运行时它的每一部分内容都要加载到内存中再被使用。那么对象类型的数据在内存中是如何分配的呢?咱们先来了解下内存结构,逻辑上内存大体被分为四段,分别为:栈、堆、数据段和代码段,程序中不同类型数据的声明将会被存放在不同的内存段里面,每段内存的特点是这样的:
1、栈
栈的特点就是空间小但被CPU访问的速度快,适合存放程序中临时创建的变量。由于栈的先进后出的特点,所以栈特别适合用于保存和恢复调用现场。从这个意义上讲,我们可以把栈看成是一个临时数据寄存、交换的内存区,一个用于存储占用空间定长且占用空间小的数据的内存段。例如整型1、100、1000等在内存中占用的空间是等长的,占用的空间都是32位4个字节。还有double、boolean等都可以存储在栈空间中。
2、堆
堆是用于在程序运行过程中被动态分配的内存段,它的大小不固定,可动态地扩张或缩减。用于存储数据长度可变或占用内存比较大的数据。例如,字符串、数组和对象就存放在这段内存中。
3、数据段
数据段用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序中静态分配的变量。
4、代码段
代码段用来存放可执行文件的操作指令,也就是说它是可执行文件在内存中的镜像。代码段需要防止程序在运行的过程中被非法修改,所以只准许读取操作,而不允许写入(修改)操作。例如,程序中的函数就存放在这段内存中。
回过头来,我们来说说对象类型的数据在内存中如何分配的,对象类型的数据占用的空间比较大,且占用的空间不定长,所以对象创建完成以后被存放在堆内存中,但对象的引用名称存放在栈里面。程序在运行时,栈里的数据是可以直接存取的,而堆内存中的数据是不可以直接存取的,但可以通过对象的引用名称访问对象中的成员。