结构体&联合体
结构体内每一个变量都独占一块内存,并保持内存对齐
联合体内所有变量公用同一块内存,占用内存大小为联合体中占用内存最大的变量的内存大小
zval
zval定义
每个变量的结构定义
struct _zval_struct {
zend_value value; /* value 变量值*/
union {
struct {
ZEND_ENDIAN_LOHI_3(
zend_uchar type, /* active type 变量类型 */
zend_uchar type_flags, /* 类型掩码,各类型会有几个不同的属性值,用于内存管理*/
union {
uint16_t call_info; /* call info for EX(This) */
uint16_t extra; /* not further specified */
} u)
} v;
uint32_t type_info;
} u1;
union {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* cache slot (for RECV_INIT) */
uint32_t opline_num; /* opline number (for FAST_CALL) */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags */
uint32_t property_guard; /* single property guard */
uint32_t constant_flags; /* constant flags */
uint32_t extra; /* not further specified */
} u2;
};
- zend_value表示变量的值
- u1表示变量的类型
- u2用于辅助功能
zend_value定义
typedef union _zend_value {
zend_long lval; /* 整型 */
double dval; /* 浮点型 */
zend_refcounted *counted; /* 获取不同类型结构的gc头部 */
zend_string *str; /* 字符型 */
zend_array *arr; /* array数组 */
zend_object *obj; /* object对象 */
zend_resource *res; /* resource类型 */
zend_reference *ref; /* 引用类型 */
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce; /* 类 */
zend_function *func; /* 方法 */
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
1. 整型
在一个x86_64的机器中,整型的定义
typedef int64_t zend_long;
如果是32位的机器中,整型的定义
typedef int32_t zend_long;
2. 浮点型
从定义可以看出,就是double类型
3. 字符串-string
字符串的基本定义为:
struct _zend_string {
zend_refcounted_h gc; /* 用于gc */
zend_ulong h; /* hash value */
size_t len; /* 字符串长度 */
char val[1]; /* 字符串的实际内容,默认数组为1 */
};
4. 数组-array
数组的基本定义
struct _zend_array {
zend_refcounted_h gc;
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar flags,
zend_uchar _unused,
zend_uchar nIteratorsCount,
zend_uchar _unused2)
} v;
uint32_t flags;
} u;
uint32_t nTableMask;
Bucket *arData; /* 数组中实际存储的数据节点 */
uint32_t nNumUsed; /* 数组中使用的个数 */
uint32_t nNumOfElements; /* 数组中元素个数 */
uint32_t nTableSize; /* 数组大小 */
uint32_t nInternalPointer;
zend_long nNextFreeElement;
dtor_func_t pDestructor;
};
Bucket结构,数组中的每个元素的实际存储结构
typedef struct _Bucket {
zval val;
zend_ulong h; /* hash value (or numeric index) */
zend_string *key; /* string key or NULL for numerics */
} Bucket;
变量数据类型的表示(u1.v.type)
#define IS_UNDEF 0
#define IS_NULL 1
#define IS_FALSE 2
#define IS_TRUE 3
#define IS_LONG 4
#define IS_DOUBLE 5
#define IS_STRING 6
#define IS_ARRAY 7
#define IS_OBJECT 8
#define IS_RESOURCE 9
#define IS_REFERENCE 10