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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章