122.1栈、堆和内存的关系

  • Post author:
  • Post category:其他


在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

相关资料参考(其中C++中包括了五大内存中,栈和堆占了两大分区):


【179】C++相关知识 在C++中五大内存分区

在PHP 中8种数据类型在运行的过程中,都需要加载到内存中去使用,那么他们在内存中是怎样分配工作的呢?



1、堆栈空间分配区别


栈(操作系统):


栈是存储占用相同空间长度并且占用空间小的数据类型的地方。

比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

存储的都是局部变量或者函数的参数值,凡是定义在方法中的都是局部变量(方法外的是全局变量),变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。所以在栈空间的数据都是可以通过代码手动进行释放。最终是由操作系统(编译器)自动分配释放 。


堆(操作系统):


堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。

实例对象,和数组。



2、堆栈缓存方式区别

栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。



3、堆栈数据结构区别

堆(数据结构):堆可以被看成是一棵树,如:堆排序。

栈(数据结构):一种先进后出的数据结构。

堆,队列优先,先进先出(FIFO—firstinfirstout)。

栈,先进后出(FILO—First-In/Last-Out)。

在PHP中,基本类型变量放在栈中,对象、数组放在堆中。对象的真正内容是存在堆中,

比如代码块

<?php
	class A {
		public $num = 100;
	}
	$a = new A();
	$b = $a;
	$a->num = 200;
	echo $b->num;

这段代码输出的结果是 200 ,




a

,

a,






a


,





b 都村访问对象在堆中的地址,所以



a

>

n

u

m

a->num 和






a







>








n


u


m








b->num 访问的是同一份数据。


php 代码的执行过程


经过词法解析,语法解析,源程序会被分已成opcodes 指令,zend 虚拟机一次执行这些指令完成操作。



php中规定,使用“&”符号,可以将普通赋值改成内存地址

&赋值的时候,视为一个变量定义了一个别名,增加了一个对内存空间的引用。改变其中一个,会影响其他的引用。而使用unset()时,只是断开了对变量内存空间的引用,内存空间不会释放。



版权声明:本文为weixin_39534472原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。