PHP对象的内存模型
对象在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,
在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?
内存从逻辑上 说大体上是分为4 段:
栈空间段、堆空间段、代码段、初始化静态段
程序里面不同的声明 放在不同的内存段里面
数据段(data segment):是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量;
代码段(code segment / text segment):是指用来存放程序执行代码的一块内存区域,比如函数和方法;
栈空间段:是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,
在内存里面占用空间是等长的,都是64 位4 个字节。那么数据长度不定长,
而且占有空间很大的数据类型的数据放在那内存 的那个段里面呢?这样的数据是放在堆内存里面的。
如下图:
栈内存是可以直接存取的,而堆内存是 不可以直接存取的内存。
对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,
但对象名称是放在栈里面的,这样通过对象名称就可 以使用对象了。
$p1 就是我们实例出来的对象名称,同理,$p2,$p3 也是我们实例出来的对象名称,
一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3 个人来,
每个人之间是没有联系的,只能说明他们都是人类,每 个人都有自己的姓名,性别和年龄的属性,
每个人都有说话和走路的方法,只要是类里面体 现出来的成员属性和成员方法,
实例化出来的对象里面就包含了这些属性和方法。
$p1=new Person();
对于这个条代码,$p1 是对象名称在栈内存里面new Person()是真正的对象是在堆内存 里面的,具体的请看下图:
从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体,
上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,
每个对象之间都是相互独立的,使用自己的空间,在PHP 里面,
只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓 名、性别和年龄。
每个属性又都有一个地址。 $p1=new Person();等号的右边$p1 是一个引用变量,
通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,
所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,
所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。
PHP对象的内存模型相关推荐
- Java对象的内存模型
众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...
- java对象内存模型_Java对象的内存模型
众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...
- C++对象模型4——多重继承的对象内存模型、vptr与vtbl的创建与重置的时机、不要在含有虚函数的类的构造函数中调用memset
一.多重继承的对象内存模型 class Base1 { public:virtual void f() {cout << "base1::f()" << e ...
- python对象内存模型
原文:Python的垃圾回收机制(二)之内存模型 1. Python对象内存模型 首先介绍一下Python对象的内存模型,如下图1所示: 图1. PyObject对象内存模型 上图可以看到,一个PyO ...
- C++虚继承下的内存模型(二)
对于虚继承,恰恰和普通继承相反,大部分编译器会把基类成员变量放在派生类成员变量的后面,这样随着继承层级的增加,基类成员变量的偏移就会改变,就得通过其他方案来计算偏移量. 下面我们来一步一步地分析虚继承 ...
- String的内存模型,为什么String被设计成不可变的
String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...
- 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
# 一行代码是怎么运行的 首先,java代码会被编译成字节码,字节码就是java虚拟机定义的一种编码格式,需要java虚拟机才能够解析,java虚拟机需要将字节码转换成机器码才能在cpu上执行. 我们 ...
- Swift 对象内存模型探究(一)
MemoryLayout 基本使用方法 HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用. 由于 S ...
- java内存模型 创建类_JVM内存模型及String对象内存分配
昨天看了一篇关于<Java后端程序员1年工作经验总结>的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型. 1. ...
最新文章
- 解决Missing artifact com.sun:tools:jar:1.5.0方法
- ios 视频旋转---分解ZFPlayer
- matlab在电力行业中的仿真技术-MATLAB小电流接地系统单向故障仿真分析
- 关于图片缩放的两种方式
- Linux--结构体的详细学习
- python之路day4_python之路day4
- 德勤发布2021年度企业AI应用现状报告,AI驱动已成竞争必需品
- python解析sql语句表名_python正则表达式匹配sql语句中的表名
- 可口可乐开了家网店卖奶,价值62亿元
- 读 疯狂的程序员 有感
- Shape Shifter——制作简单动画
- 让大疆灵眸 OSMO 口袋云台相机支持直播
- Visual Studio 2005 Service Pack 1 (SP1)
- android通讯录换ipone,换新iPhone手机,通讯录你会转移吗?90%人居然还不会!
- c++面试常见题·Part 2 数据结构和STL
- 渗透测试工程师面试题大全(三)
- 3Dmax Bones骨骼学习记录一
- 什么是双因素身份验证?
- 微信小程序(一)初始微信小程序
- 按防电击类型分类的II设备(无保护接地线缆)可免于线对地的浪涌实验
热门文章
- 【tensorflow】tf.layers.conv1d函数解析(一维卷积)
- Qt学习笔记之数据库
- Android build.gradle 获取Git 仓库数据
- git删除所有历史提交记录,只留下最新的干净代码
- 《Photoshop Lab修色圣典(修订版)》—第1课深入讨论
- web项目没有run on server时..
- ☆聊聊Spring系列_Index
- VS2005--设置Release模式下调试
- 3.1 Android组件intent filter
- Python的matplotlib—绘图(3)