Вопрос:

Как V8 хранит целые числа, такие как 5?

javascript memory memory-management v8

54 просмотра

2 ответа

3 Репутация автора

Как V8 хранит целые числа в памяти?

Например, целое число 5?

Я знаю, что он хранит его в куче, но как именно он хранит его? Такие вещи, как метаданные и сама фактическая стоимость. Есть ли константа, добавленная в int перед сохранением?

Автор: Спасимир Павлов Источник Размещён: 04.08.2019 05:29

Ответы (2)


0 плюса

4955 Репутация автора

В Javascript все числа хранятся как 64-битные значения с плавающей точкой. C и C ++ называют этот тип double. Нет определенного "целочисленного" типа.

В некоторой степени вы можете наивно использовать целочисленные значения и получать ожидаемый результат, не опасаясь ошибок округления. Эти целые числа являются так называемыми «безопасными» целыми числами.

Все целые числа в диапазоне [- (2 ^ 53 - 1), + (2 ^ 53 - 1)] являются "безопасными" целыми числами, как описано здесь . Это означает, что если вы добавляете, вычитаете или умножаете целые числа в этом диапазоне, и результат также находится в этом диапазоне, то вычисление происходит без ошибок округления.

Конечно, все значения в Javascript / V8 каким-то образом «упакованы», потому что переменная не имеет типа (за исключением маленьких целых чисел, которые используют теговые указатели). Если у вас есть переменная, xто 5.25она должна знать, что это «число» и что это число 5,25. Таким образом, это займет более 8 байтов пространства. Вам нужно будет найти исходный код v8, чтобы узнать больше.

Автор: Michael Размещён: 04.08.2019 05:47

0 плюса

298 Репутация автора

V8 использует схему тегов указателей для различения маленьких целых чисел и указателей объектов кучи. 5 будет храниться как Smiтип, который не является кучей, выделенной в V8.

Вы можете проверить исходный код класса Smi, чтобы узнать больше.

На 32-битных платформах Smis представляют собой 31-битное целое число со значением 0, установленным для нижнего бита. На 64-битных платформах Smis имеют 32-битное целое число со знаком, 31 бит с заполнением 0 и 0 для младшего бита. У указателей на объекты кучи установлен 1 для нижнего бита, так что V8 может отличить указатели от Smis без дополнительных метаданных.

Автор: Superfly Размещён: 09.08.2019 09:03
Вопросы из категории :
32x32