Как это работает внутренне массивы в PHP?


PHP обрабатывает arrays) таким образом, различные языки, по-видимому, существует понятий hashtable, чтобы связать значения. Как это работает внутренне core языка, их arrays) ?

Author: Maniero, 2019-02-07

1 answers

PHP имеет то, что называется array ассоциативного и внутренне иной форме hashtable то же, поэтому он может иметь ключи особенностей различных типов данных и имеет сложность O(1) для почти всех основных операций, так как array нормально. На самом деле такой сложности, как правило, O(1), она может быть до O(n), но на практике не достигает случиться. Очевидно, что ключ индекса вычисляется по функция хэш по умолчанию язык или специалиста в примитивных типов нее.

На самом деле почти все структуры данных в целом и организации из памяти, определяет, по таблицам укладки (hashtable), аналогично с JavaScript, но это не так заметны, и столь линейной, как в JS, что все является объектом, созданным на вершине hashtable.

Нет оптимизации, чтобы получить заказ уже что объект hashtable чисто не можете отображения данных в определенном порядке, то есть дополнительных затрат памяти для сканирования в порядке, работает. Посмотрите, как это нынешняя структура (если уже не изменилась), она имеет указатели для достижения поддерживать порядок ввода с помощью связанного списка от buckets:

typedef struct _hashtable {
    uint nTableSize;
    uint nTableMask;
    uint nNumOfElements;
    ulong nNextFreeElement;
    Bucket *pInternalPointer;
    Bucket *pListHead;
    Bucket *pListTail;
    Bucket **arBuckets;
    dtor_func_t pDestructor;
    zend_bool persistent;
    unsigned char nApplyCount;
    zend_bool bApplyProtection;
#if ZEND_DEBUG
    int inconsistent;
#endif
} HashTable;

И bucket, который показывает, как является неэффективным (это почти невероятно, размер отходов, а архитектура 64 бит каждая запись занимает 72 байт, только в таблице, еще имеет за дополнительную плату в каждого элемента, который близко к нему):

typedef struct bucket {
    ulong h;
    uint nKeyLength;
    void *pData;
    void *pDataPtr;
    struct bucket *pListNext;
    struct bucket *pListLast;
    struct bucket *pNext;
    struct bucket *pLast;
    const char *arKey;
} Bucket;

Таким образом, общие значения выделяются также неэффективно в PHP, arrays) не могли быть разные, хотя имел оптимизации усилий в последнее время.

Например, я обнаружил, что все значения хранятся так:

typedef union _zvalue_value {
    long lval;  /* long value */
    double dval;  /* double value */
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;  /* hash table value */
    zend_object_value obj;
} zvalue_value;

64 бит эта структура будет 16 байт, потому что len находится там, а не у компании " string себе, так что любое значение, которое не будет string тратится 8 байт из-за выравнивание. Наглядно структура была разработана для 32-разрядных, которая тратит ничего. Затем запустить PHP на 64-разрядных, возможно, почти в два раза больше памяти, чем 32-разрядные, а ты нулевой прирост. Кто знает, в один день решить это, они проявляют волю.

И Не могу дать вам так подробно именно потому, что внутренняя работа-это деталь реализации, и ничто не мешает провести функционировать совсем по-другому.

И если все это странно для вас, предлагаю начать учиться чуть более информатики, в частности, структуры данных. Немного C помогает понять эти коды internals PHP.

 8
Author: Maniero, 2020-08-27 13:41:48