小而巧的zval
扩充:
结构体: 比如
struct test { char a //1 int b//4 long c //8 }
总共占了2*8=16字节
因为结构体对齐,虽然浪费字节,但是得益于内存对齐,存取速度会更快
联合体:比如 union{
char a; //1 int b;4 long c ; //8
}
结果:(gdb) p sizeof(union test) $1=8
它复用了同一块内存,a、b和c公用同一块内存,修改a,也会修改b和c的值,同时可以知道联合体的大小为其最大成员的大小
栈区:存储参数值、局部变量,维护函数调用关系,栈的变量是局部的,随着局部空间的销毁而销毁,由系统负责
堆区:动态内存区域,随时申请和释放,程序自身要对内存泄露负责,堆上面的变量可以提供全局访问,需要自行处理其生命周期
zval可以表示PHP中任意一个变量
struct_zval_struct{
zend_value value;
union u1;
union u2;
}
typedef union_zend_value{
zend_long lval; //整形
double dval; //浮点型
zend_refcounted *counted
zend_string *str; //字符串
zend_array *arr; //数组 ->hashtable
zend_object *obj; //对象
zend_resource *res; //资源类型
zend_reference *ref; //引用类型
zend_ast_ref *ast; //抽象语法树
zval *zv; //还可以指向一个zval
void *ptr; //不确定类型
zend_class_entry *ce;//类
zend_function *func;
}zend_value;
源码图:文件zand_types.h