Dieser Artikel stellt Ihnen „Analyse des zugrunde liegenden PHP8-Kernel-Quellcodes – Array (2)“ vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Empfohlene verwandte Artikel: „Analyse des zugrunde liegenden PHP8-Kernel-Quellcodes – Array (1)“ „Analyse des zugrunde liegenden PHP8-Kernel-Quellcodes – Array (3)“ „Analyse des zugrunde liegenden PHP8-Kernel-Quellcodes – Array ( 4)"
zend_array ist in PHP in zwei Typen unterteilt
1.packed array
2.hash array
1 |
|
Tatsächlich unterscheidet sich die Reihenfolge im Quellcode geringfügig von meiner oben. Ich denke, meine oben Die Reihenfolge ist vernünftiger zu verstehen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
Verwenden Sie das vom Verstehenstool generierte Mitgliedsvariablendiagramm wie folgt
Nach der gesamten Erweiterung lautet es wie folgt
Zend_array-Strukturmitglied
Das ist zu sehen Der Kern ist eigentlich z_val +zend_string +zend_refcounted_h+Bucket, das Schicht für Schicht verknüpft ist
wo Bucket gespeichert ist. Die Schlüsselinformationen des Arrays
1 2 3 4 5 |
|
Egal, ob der Array-Typ gepacktes_array oder hash_array ist, das wird es schließlich im Bucket gespeichert werden
Wenn die Schlüssel alle numerische Tasten sind und die Schlüssel in der Einfügereihenfolge aufsteigen, ist der Array-Typ packed_array
Eigenschaften eines gepackten Arrays
Das dritte und vierte Element können in PHP als Arrays verstanden werden. Wenn der Schlüssel nicht geschrieben ist, wird der Standardschlüssel beginnend bei 0
1 2 |
|
bucket Vor dem Array befindet sich ein Indexarray.
Wenn es sich um ein gepacktes Array handelt, beträgt die Größe des Indexarrays immer 2, da es nicht verwendet wird.
Der Inhalt im zend_array entsprechend $a oben ist
nTableSize; stellt die Größe des Bucket-Arrays dar, auf das arData zeigt, also die Anzahl aller Buckets. = Die Gesamtgröße des Arrays nNnumused; bezieht sich auf die Anzahl aller Buckets, einschließlich der Anzahl gültiger und ungültiger Buckets.
Bucket, es gibt drei Zustände, die wirksam und ineffektiv sind.So nNumOfElements+nNumUsed =nTableSize
nTableMask; Da das gepackte Array keinen Index verwendet, ist es immer -2nNextFreeElement. Der Index des Schlüssels des nächsten eingefügten Elements. Das gepackte Array nutzt die Kontinuitätseigenschaften des Bucket-Arrays, um bestimmte Szenarien nur mit numerischen Schlüsseln zu optimieren . . Da das Index-Array nicht mehr benötigt wird, werden (nTableSize-2)* sizeof(uint32_t) Bytes aus dem Speicherplatz gespart. Da der Zugriff auf den Bucket das Bucket-Array direkt betreibt, wird außerdem auch die Leistung verbessert.Wenn die Bedingungen eines gepackten Arrays nicht erfüllt sind, wird das Array in PHP durch hash_array dargestellt
Alle Schlüsselwerte, die nicht numerisch sind, werden durch hash_array dargestellt1 |
|
$c oben wird durch hash_array dargestellt
Bucket ist wie folgt
zend_array ist wie folgt
nTableSize ; Gibt die Größe des Bucket-Arrays an, auf das arData zeigt, also die Anzahl aller Buckets. =8
nNumUsed; Bezieht sich auf die Anzahl aller verwendeten Buckets, einschließlich der Anzahl gültiger Buckets und ungültiger Buckets =4
NumOfElements; =4
So nNumOfElements+nNumUsed =nTableSizenTableMask; -8nNextFreeElement; Der Index des Schlüssels des nächsten eingefügten Elements hash_array ist immer 0, wenn er nicht verwendet wird▏Dieser Artikel wurde vom ursprünglichen Autor PHP Cui Xuefeng genehmigt und auf der PHP-Chinese-Website veröffentlicht Die ursprüngliche Adresse lautet: https://zhuanlan.com/p/358354087
Das obige ist der detaillierte Inhalt vonParsen des zugrunde liegenden PHP8-Kernel-Quellcodes – Array (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!