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 这个引用变量来操作对象,通常我们也 称对象引用为对象。

时间: 2024-10-15 04:25:41

php内存空间存储问题的相关文章

前端进击的巨人(二):栈、堆、队列、内存空间

面试经常遇到的深浅拷贝,事件轮询,函数调用栈,闭包等容易出错的题目,究其原因,都是跟JavaScript基础知识不牢固有关,下层地基没打好,上层就是豆腐渣工程,新人小白,踏实踩土才是关键. 打地基第二篇:本篇我们将对JavaScript数据结构的知识点详解一二. JavaScript中有三种数据结构: 栈(stack) .堆(heap). 队列(queue). 栈(stack) 栈的特点是"LIFO,即后进先出(Last in, first out)".数据存储时只能从顶部逐个存入,取

内存地址与内存空间

概览 基本概念 进入误区 误区诊断 总结 基本概念 什么是位? 什么是字节? 位表示的是二进制位,一般称为比特,即0或1,是计算机存储的最小单位: 字节是计算机中数据处理的基本单位: 计算机中以字节为单位存储和解 释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特. 1Byte=8bit 地址总线? (1)CPU是通过地址总线来指定存储单元的. (2)地址总线决定了cpu所能访问的最大内存空间的大小. (3)地址总线是地址线数量之和. 内存地址? 是一种用于软件及硬件等不同层级中的数

关于内存地址和内存空间的理解。

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

C++中类的内存空间大小(sizeof)分析

首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2字节的(主要是因为TC是16位的,所以int类型也该是16位的)VC++里,int是4字节的,因为现代操作系统下的软件大多是是32位.64位的VC++,本来按理说,该是8字节的,但是可能为了维持32位的源代码移植到64位尽量不出错,所以也维持了4字节的长度.至于其他有名的编译器,如gcc,我还没用过,你得查一查它所规定int的长度 或者利用sizeof(int)也可以计算出来.本人电脑上计算如下: 在C

王爽-汇编语言-综合研究三-使用内存空间

(一) 研究概述 数据不仅可以存储在寄存器中,还可以存储在内存中.这次我们就研究在C语言中,怎样直接在内存中存储数据.以及这样做的一些延伸问题.另外,在附录研究中,我们还探究了C语言中循环和分支结构的实现. (二) 研究过程 1) 直接在C语言中使用内存空间 此处援引书中的话: 对于存储空间来说,要使用他们一般都需要给出两个信息:一是指明存储空间所在.是哪个的信息:二是指明存储空间有多大的类型信息. 对于寄存器来说,就需要给出寄存器的名称,寄存器的名称就也包含了他们的类型信息. 对于内存空间来说

Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何在 Windows 上安装并使用,一些 GUI 工具和自己简单封装的 RedisHelper. <Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合>讲的是 Redis 中最核心的内容,最常用的就是和数据类型打交道. 目录 事务 过期时间 消息通知 管道 优化内存空间

java中的各种数据类型在内存中存储的方式

1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间.释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2.什么叫java的内存泄露 在j

java对象的内存布局(一):计算java对象占用的内存空间以及java object layout工具的使用

最近在学习java对象内存布局方面的一些知识,主要是想知道一个java对象到底占用多少内存空间,以及java对象在内存中到底是什么样子的.c/c++中的sizeof运算符能够方便地告诉我们一个变量占用的内存空间,但是在java中却没有直接提供这种机制.如果想获取java对象占用的内存大小,可以利用java的Instrumentation机制.java.lang.instrument.Instrumentation这个接口提供了getObjectSize(Object objectToSize),

前端基础进阶(一):内存空间详细图解

变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所以对于前端开发来说,内存空间并不是一个经常被提及的概念,很容易被大家忽视.特别是很多不是计算机专业的朋友在进入到前端之后,会对内存空间的认知比较模糊,甚至有些人干脆就是一无所知. 当然也包括我自己.在很长一段时间里认为内存空间的概念在JS的学习中并不是那么重要.可是后我当我回过头来重新整理JS基础时,发现由于对它们