有權利要求中本文該整數的在JavaScript的陣列是由C 陣列整數來實作的。
然而; 根據MDN,除非您專門使用 BigInts,否則在 JavaScript 中所有數字都被抑制為雙精度數。
如果我做:
cont arr = [0, 1, 2, 3];
V8引擎中的實際表現是什么?
V8 的代碼在 github 上,但我不知道在哪里看:
uj5u.com熱心網友回復:
(V8 開發者在此。)“C 整數陣列”有點簡化,但那篇文章中描述的關鍵思想是正確的,陣列[0, 1, 2, 3]將存盤為“Smis”陣列。
什么是“思密”?而在JavaScript中的每個數字必須表現得像一個IEEE754雙,V8內部表示號碼為“小的整數”(31位帶符號整數值 1個位元標記)時,它可以,例如,當數具有范圍的積分值-2**30到2**30-1,以提高效率。引擎通常可以在引擎蓋下做任何他們想做的事情,只要事情表現得好像實作完全符合規范。因此,當規范(或 MDN 檔案)說“所有數字都是雙打”時,從引擎(或引擎開發人員)的角度來看,它的真正含義是“所有數字都必須表現得好像它們是雙打”。
當陣列僅包含 Smis 時,陣列本身會跟蹤該事實,以便從此類陣列加載的值無需檢查即可知道它們的型別。這很重要,例如a[i] 1,當 已經知道它是一個 Smi 陣列時,它的實作 不必檢查是否a[i]是一個 Smi a。
當第一個不適合 Smi 范圍的數字存盤在陣列中時,它將轉換為雙精度陣列(嚴格來說仍然不是“C 陣列”,而是垃圾收集堆上的自定義陣列,但它類似于 C 陣列,所以這是解釋它的好方法)。
當第一個非數字存盤在陣列中時,會發生什么取決于陣列之前處于什么狀態:如果它是“Smi 陣列”,那么它只需要忘記它只包含 Smis 的事實。不需要重寫,因為 Smis 是有效的物件指標,這要歸功于它們的標記位。如果陣列之前是“雙陣列”,則必須重寫它,以便每個元素都是有效的物件指標。此時,所有雙精度值都將被“裝箱”為所謂的“堆編號”(托管堆上僅包含雙精度值的物件)。
總之,我想指出的是,在絕大多數情況下,無需擔心任何這些內部實作技巧,甚至無需意識到它們。我當然理解你的好奇心!此外,陣串列示是不考慮實作細節的微基準很容易通過建議不會轉移到更大應用程式的結果而產生誤導的更常見原因之一。
處理意見:
V8 有時甚至使用 int16 或更低版本。
不,它沒有。它可能會或可能不會在未來開始這樣做;盡管如果有任何變化,我猜想未標記的 int32 比 int16 更有可能被引入;此外,如果實施發生任何變化,那么可觀察到的行為當然不會改變。
如果您認為您的應用程式會從 int16 存盤中受益,您可以使用 anInt16Array來強制執行,但一定要衡量這是否真的對您有益,因為很可能不會,甚至可能會降低性能,具體取決于您的應用程式的功能用它的陣列。
當您將其設為小數時,它可能會開始成為雙精度數
稍微準確一點:需要將 Smis 陣列轉換為雙精度陣列的原因有多種,例如:
- 在其中存盤一個小數值,例如
0.5 - 在其中存盤一個大值,例如
2**34 - 存盤
NaN或Infinity或-0在它
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386039.html
標籤:javascript 数组 双倍的 v8
