typedef union _zvalue_value {
longlval; /* long value */doubledval; /* double value */struct { char *val; intlen; } str; HashTable *ht; /* hash table value */zend_object_valueobj; } zvalue_value;//a union is simply a single type that can be interpreted in different ways depending on how its accessed.//联合体仅仅代表一种可以解释为多种实际类型的抽象类型,但是每次必须解释为一种实际的类型
1、union中可以定义多个成员,union的大小由最大的成员的大小决定。 2、union成员共享同一块大小的内存,一次只能使用其中的一个成员。 3、对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节) 4、联合体union的存放顺序是所有成员都从低地址开始存放的。//最大为96bits,所以联合体的内存大小为96bits从上面可以看出,_zvalue_value只能直接表示五种类型,其他的类型需要进行转换。BOOL,NULL,RESOURCE都存储为long(int)。
typedef struct _zval_structzval;
struct_zval_struct { /* Variable information */
zvalue_value value; /* value */
zend_uintrefcount__gc; //引用计数 zend_uchartype; /* active type */
zend_ucharis_ref__gc; //标识是否是引用 };
获取zval结构的类型
Z_TYPE(zval)
获取zval结构的值Z_LVAL(zval) //获取整型值Z_DVAL(zval) //获取浮点数
如:
#define Z_LVAL(zval) (zval).value.lval
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 15:18:04