zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    Aizu 0033
    Aizu 0118
    【思维】贪心+细节——cf1361B
    【思维】构造+凸包+向量叉积——LEETCODE 游乐园的迷宫
    【思维】三元环计数+鸽笼定理/贪心——LEETCODE 游乐园的游览计划 好题
    dp+线性筛——LEETCODE切分数组
    【经典】带障碍的铺砖块——LEETCODE 覆盖
    【思维】树形dp+构造——leetcode二叉树任务调度
    【思维】状压dp—— 2020 联想杯 M
    【思维】建图+排列组合+预处理+最短路—— 2020 联想杯 E
  • 原文地址:https://www.cnblogs.com/lz0925/p/11119757.html
Copyright © 2011-2022 走看看