PHP7.2中的zend_string

  • typedef struct _zend_string zend_string; zend_string是_zend_string的别名,_zend_string内容如下:
struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];
};
  • zend_string定义了四个字段:gc, h, len, val[1],先看下gc的定义,其zend_refcounted_h是一个结构体:
typedef struct _zend_refcounted_h {
    uint32_t         refcount;          /* reference counter 32-bit*/
    union {
        struct {
            ZEND_ENDIAN_LOHI_3(
                zend_uchar    type, // 类型标识
                zend_uchar    flags,    /* used for strings & objects */
                uint16_t      gc_info)  /* keeps GC root number (or 0) and color */
        } v;
        uint32_t type_info;
    } u;
} zend_refcounted_h;

struct _zend_refcounted {
    zend_refcounted_h gc;
};

该结构体用于垃圾回收机制,后续再做分析。

  • h是typedef uint64_t zend_ulong类型的一个变量,保存字符串对应的哈希值,其后续会用在数组里面。

  • len和val[1]用于标识字符串,c语言中字符串的表示形式可以以\0结尾,通过遍历得到字符串长度,但是其非二进制安全,如字符串中本身就包含\0,那么该字符串\0后面的字符串会被截断,这里len用于保存字符串的长度, val是一个柔性数组。实现的字符串是二进制安全的。

  • 常量字符串的refcount默认是0, 变量字符串的refcount默认是1, 变量字符串是写时复制的,只有在修改字符串的时候才会进行拷贝,否则是将两个变量指向同一内存地址,refcount进行加1。

发布了60 篇原创文章 · 获赞 0 · 访问量 1439

猜你喜欢

转载自blog.csdn.net/ClassmateLin/article/details/104324585