首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于PHP语言在内存中的分配(堆和栈的区别)

关于PHP语言在内存中的分配(堆和栈的区别)

原创
作者头像
C4rpeDime
发布2018-07-23 23:10:08
2.3K0
发布2018-07-23 23:10:08
举报
文章被收录于专栏:黑白安全黑白安全黑白安全

本文以PHP语言为例来分析计算机中各段存储区的区别,代码段、堆空间段、代码段、初始化静态常量段。

在PHP中共有8种数据类型,其中4中标量类型(字符串、布尔型、整型、浮点型)、2种复合类型(对象、数组)、2种特殊类型(资源、NULL)。他们在运行的时候都要加载到内存中去用,那么在内存里面它们是怎么表示的呢?

初始化静态常量段:通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量。

代码段:通常是指用来存放程序执行代码的一块内存区域,比如函数和方法。

堆空间段:是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。所以在栈空间的数据都是可以通过代码手动进行释放。

栈内存段:数据长度不定长,而且占有空间很大的数据类型的数据。在堆内存是里是不可以直接存取的内存,堆内存存储的是数组和对象(其实数组就是对象)。凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,最后通过垃圾回收机制去实现垃圾回收。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象。

$p1=new Person();

对于这个条代码,$p1 是对象名称在栈内存里面new Person()是真正的对象是在堆内存 里面的,具体的请看下图:

关于PHP语言在内存中的分配(堆和栈的区别) 关于PHP语言在内存中的分配(堆和栈的区别) 代码艺术
关于PHP语言在内存中的分配(堆和栈的区别) 关于PHP语言在内存中的分配(堆和栈的区别) 代码艺术

从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体, 上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。 每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓 名、性别和年龄。每个属性又都有一个地址。 $p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档