Структура объекта визуализируется в памяти - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь представить, как объект Javascript помещается в память.Поскольку это объект, он хранится в куче памяти.Это также коллекция пар ключ-значение.

Теперь у меня есть вопрос, реализованы ли объекты Javascript как структура связанного списка?Или это что-то еще?

Здесь я сделал изображение, которое отображается в память из этого кода:

var o  = {} 
var o1 = { a: 1, b: o }

enter image description here

Итак, сосредоточив внимание на o1, есть сегмент памяти, который имеет ссылку на значение 1, и мы назвали это пространство как a.Также свойство b имеет адрес для другого объекта.

Мой вопрос таков: является ли это точным представлением объекта Javascript, отображенного в памяти?Если нет, то что мне не хватает?

1 Ответ

0 голосов
/ 24 февраля 2019

Fundamentall, я думаю, что ваша диаграмма в основном правильная, по крайней мере, в основной идее, что объект является определенной областью памяти со слотами для его свойств.

Фактическая структура памяти не определена спецификациейи может варьироваться от движка JavaScript до движка JavaScript.

Что спецификация должна сказать , это то, что

Объект логически представляет собой набор свойств.

... где свойства данных, такие как a и b, имеют имя и значение.1 - это значение, а объект - это значение (подробнее об этом чуть позже).Спецификация не затрагивает вопрос о том, как на значения ссылаются из разных мест.

Современные современные движки JavaScript создают классы «на лету» для оптимизации доступа к свойству, поскольку доступ к свойству является очень распространенной операцией.Они также обрабатывают объекты через ссылки на объекты , которые являются значениями, указывающими, где реальный объект находится в другом месте в памяти от ссылки.В современном движке вполне вероятно, что ваш объект реализован с помощью слотов памяти для a и b, оба из которых, вероятно, имеют размер 64 бита (но я не знаю, что может варьироваться), и что значение 1 равносохраняется непосредственно в слоте, а ссылка на объект для b (которая, опять же, указывает на объект в другом месте в памяти) также сохраняется непосредственно в слоте.Детали будут различаться в зависимости от движка.

Так, например, ваш код может создать что-то подобное в памяти (не учитывая много деталей):

                                    +−−−−−−−−−−+
o: Ref33454−−−−−−−−−−−−−−−−−−−−−−+−>| (Object) |
                                 |  +−−−−−−−−−−+
                                 |  +−−−−−−−−−−+
                                 |
                +−−−−−−−−−−−−−−+ |
o2: Ref54612−−−>|   (Object)   | |
                +−−−−−−−−−−−−−−+ |
                | a: 1         | |
                | b: Ref33454  |−+
                +−−−−−−−−−−−−−−+

Примечание:

Поскольку это объект, он хранится в куче памяти.

Это неверное предположение.Если это происходит, например, в функции, и функция используется настолько, что движок JavaScript решает активно ее оптимизировать, одна из таких оптимизаций, используемая V8 (по крайней мере), заключается в том, чтобы определить, полностью ли содержится срок жизни объекта в функции.вызовите и, если это так, разместите его в стеке, поскольку распределение и очистка стека происходит очень быстро.Таким образом, вполне возможно, что объект находится в стеке, а не в куче (и, если я правильно помню, возможно, чтобы он был скопирован из стека в кучу, если это необходимо, поскольку в некоторых путях кода онвыживает после завершения вызова функции).

...