在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(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()时,只是断开了对变量内存空间的引用,内存空间不会释放。