在PHP5 zval
1。 / /机制
_zval_struct { typedef struct
zvalue_value价值;
zend_uint refcount__gc;
zend_uchar型;
zend_uchar is_ref__gc;
zval };
2。 / / zvalue_value
_zvalue_value { typedef联盟
长的语句; / /布尔型、整型和资源
类型 双dval; / /浮点型
结构字符串
字符*;
Int len;
STR };
哈希表* HT; / /阵列
zend_object_value obj; / /对象
zend_ast * AST; / /常量表达式(php5.6只)
zvalue_value };
三. / / zend_object_value
_zend_object_value { typedef struct
zend_object_handle手柄;
const zend_object_handlers *
处理;
Zend_object_value};
4。 / / zend_object_handle
typedef unsigned int zend_object_handle;
大多数的文章都提到,当指PHP5,变结构sizeof(变量)= 24,sizeof = 16(zvalue_value),其实这种说法是不准确的,在CPU的64位,结果是
正确的。
但当CPU 32bit sizeof(变量)= 16,sizeof = 8(zvalue_value),主要是因为CPU是64位,指针是8个字节,和32位,指针是4个字节。
在PHP 7中zval
1。 / /机制
结构_zval_struct {
zend_value值; / * * /
联盟{
struct {
zend_endian_lohi_4(
zend_uchar型、主动型 / * * /
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar预留电话信息(Ex) / * * /本)
V };
uint32_t type_info;
U1 };
联盟{
uint32_t下哈希碰撞链; / * * /
uint32_t cache_slot文字缓存槽; / * * /
uint32_t株系(AST值; / * * /节点)
uint32_t num_args;
参数个数为(前/本)。
uint32_t fe_pos foreach
位置; / * * /
uint32_t fe_iter_idx foreach迭代器指数; / * * /
uint32_t access_flags类常量访问标志; / * * /
uint32_t property_guard单一物业的保安; / * * /
U2 };
};
2。 / / zend_value
_zend_value { typedef联盟
zend_long lval长值; / * * /
双双双值; / * * /
zend_refcounted *数;
zend_string * STR;
zend_array * ARR;
zend_object * OBJ;
zend_resource * RES;
zend_reference *
参考;
zend_ast_ref * AST;
zval * ZV;
void*指针;
zend_class_entry *;
zend_function *
功能;
struct {
uint32_t W1;
uint32_t W2;
WW };
zend_value };
PHP 7似乎很多,但实际上它是简单的,CPU是否是32位或64位,sizeof(变量)总是等于16。
主要在WW看到zend_value是两uint32_t,这总是8字节,因此sizeof(zend_value)= 8,因此sizeof(变量)= 16。
所以,在这一点php7节省内存的新特点,在32位系统,PHP5 = > php7没有变化。
Sizeof,顺便说一下,不能作为一个功能,虽然写的是像一个
函数,该值将在编译时确定的,不是类似于编译预处理
运行。
总结
以上
介绍的是Xiaobi的PHP变量的结构,我们希望能帮助你。如果你有任何问题,请给我留言,萧边会及时给您回复。谢谢您
支持网站。