<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 結構體 #### zend_array ```c // HashTable為zend_array的別名 typedef struct _zend_array HashTable; // zend_array結構體 struct _zend_array { zend_refcounted_h gc; // 引用計數 union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar flags, // 例如,HASH_FLAG_PACKED是否為packed array,HASH_FLAG_INITIALIZED是否初始化數組 zend_uchar nApplyCount, zend_uchar nIteratorsCount, zend_uchar consistency) } v; uint32_t flags; } u; uint32_t nTableMask; // 用于計算索引,例如 nIndex = h | ht->nTableMask (nTableMask是一個負值,packed array默認為-2,hash array為-8) Bucket *arData; // bucket數組 uint32_t nNumUsed; // 已用bucket數 uint32_t nNumOfElements; // 已有元素數,nNumOfElements <= nNumUsed,因為刪除的并不是直接從arData中移除 uint32_t nTableSize; // 數組的大小,為2^n uint32_t nInternalPointer; // 數值索引 zend_long nNextFreeElement; dtor_func_t pDestructor; }; ``` 數組使用哈希表(hashTable)來實現,哈希表即通過key-value訪問數據,這里的key是直接映射到內存地址,也就是說根據key可以直接獲得保存在內存的值(這種方式稱尋址技術); 數組的元素存在Bucket結構: ```c //Bucket:散列表中存儲的元素 typedef struct _Bucket { zval val; // 存儲的具體value,這里嵌入了一個zval,而不是一個指針 zend_ulong h; // key根據times 33計算得到的哈希值,或者是數值索引編號 zend_string *key; // 存儲元素的key } Bucket; ``` ### packed array和hash array &emsp;&emsp;packed array不需要索引表,空間和效率上優于hash array - packed array可以簡單理解為數字索引數組(事實上數字索引是有序的,并且不能間隔太大,否則為轉為hash array) - hash array可以理解為關聯數組 ### 哈希沖突 &emsp;&emsp;即不同的bucket.key經過哈希函數得到相同的值(key通過zend_string_hash_val(key)可以計算h的值),但這些值需要同時插入nIndex數組, 但出現沖突時將原有的arData[nIndex]的位置信息存儲到新插入的value的zval.u2.next中,再將新value的存儲地址更新到索引數組 ### 數組操作API - zend_hash_init 數組初始化,設定zend_array初始值 - zend_hash_index_insert - zend_hash_find - zend_hash_add_new 插入uninitialized_zval到zend_array - zend_hash_packed_to_hash packed array轉為hash array - zend_hash_rehash 生成新的HashTable(刪除標識為IS_UNDF的數據,有效數據重新聚合并更新插入索引表) - zend_hash_del 刪除,不會真正刪除,只是標識,如zval.u1.v.type為IS_UNDF,只有在擴容或重建時才觸發刪除, - zend_hash_xxx 插入或更新字符串key,key指向zend_string的指針 - zend_hash_str_xxx 插入或更新字符串key,key執行char的指針,需要len表示字符串長度 - zend_has_index_xxx 插入或更新數字key
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看