天天看點

php核心-資料類型之字元串

php中字元串的結構

type struct _zend_string zend_string;

struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];
};
           

zend_value中通過str指向具體的結構。

  1. gc 變量的引用計數資訊,用于記憶體管理
  2. h 字元串通過Times 33算法計算得到的Hash Code
  3. len 字元串長度
  4. val 字元串内容

為什麼使用char[] 而不是用char* ?

val[1]并不是他隻想存儲一個位元組,在

zend_string

字元串配置設定時使用的是

malloc(sizeof(zend_string) + len))

,會額外再申請一部分記憶體,并且多申請的這部分記憶體是與

zend_string

連在一起的,

val[0]

對應的記憶體位址為整個字元串内容的起始位址。

val[0]

一直到整個連續記憶體的結束為止,都是字元串的内容。

如果

val

是個

char*

指針,那麼還需要對應另一塊位址存儲字元串真正的内容,多了一次記憶體配置設定操作。

此外,使用定長數組也有利于記憶體回收,free時直接釋放整個

zend_string

的記憶體即可。

val

中會多出一個位元組用于存儲字元串的最後一個字元

\0