122.1栈、堆和内存的关系

在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(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中,基本类型变量放在栈中,对象、数组放在堆中。对象的真正内容是存在堆中,
比如代码块


	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>numb->num 访问的是同一份数据。

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

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

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

你可能感兴趣的:(PHP)