• php基本变量


    结构体和联合体

    • struct(结构体) 和 union(联合体)
    • 结构体是8字节对齐,不够8字节的部分则空出来;
    • 联合体共用一个8字节,共享这8字节的内存,后使用的会覆盖先使用的
    • 结构体和联合体在形式上是相似的

    • 宏 在C语言可以理解为替换,类似PHP中的常量

    大小端

    • 根据机器的不同,大小端会有区别,PHP中对大小端的机器都做了兼容
     0x12345678    
    内存 低地址 ——> 高地址
    大端:0x12   34   56   78     (高位存在低地址)
    小端:0x78   56   34   12     (高位存在高地址)    大多数是小端的机器
    
    
    • PHP中变量是由_zval_struct结构体实现的,其构成如下
    struct _zval_struct {
        zend_value        value;            /* value */
        union {
            struct {
                ZEND_ENDIAN_LOHI_4(
                    zend_uchar    type,            /* active type */
                    zend_uchar    type_flags,
                    zend_uchar    const_flags,
                    zend_uchar    reserved)        /* call info for EX(This) */
            } v;
            uint32_t type_info;
        } u1;
        union {
            uint32_t     next;                 /* hash collision chain */
            uint32_t     cache_slot;           /* literal cache slot */
            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     extra;                /* not further specified */
        } u2;
    };
    
    

    联合体:value 用来存放变量的值,是一个叫做zend_value的联合体
    联合体:u1 标明变量的属性
    联合体:u2 标明变量被使用的情况

    变量的值实际存储在zend_value的联合体中,也就是value联合体, 联合体比结构体要节省很多空间。

    typedef union _zend_value {
        zend_long         lval;                /* long value */
        double            dval;                /* double value */
        zend_refcounted  *counted;
        zend_string      *str;
        zend_array       *arr;
        zend_object      *obj;
        zend_resource    *res;
        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;
    
  • 相关阅读:
    JAVA多线程2 锁
    IE8标准模式下VML不能显示问题
    JAVA多线程1
    JAVA判断32位还是64位,调用不同的DLL
    JNA调用DLL
    如何提高执行力
    httpClient多线程请求
    【NodeJS】安装
    [转载]一个项目涉及到的50个Sql语句(整理版)
    resultMap中的collection集合出现只能读取一条数据的解决方法
  • 原文地址:https://www.cnblogs.com/lz0925/p/11119757.html
Copyright © 2020-2023  润新知