穩定性: 1 - 試驗
由簡單內存分配器(處理擴展原始內存的分配)支持的緩存。Smalloc 有以下函數:
length
{Number} <= smalloc.kMaxLength
receiver
{Object} 默認: new Object
type
{Enum} 默認: Uint8
返回 receiver
對象,包含分配的外部數組數據。如果沒有傳入receiver
,將會創建并返回一個新的對象。
這可用于創建你自己的類似 buffer 的類。不會設置其他屬性,因此使用者需要跟蹤其他所需信息(比如分配的長度)。
function SimpleData(n) {
this.length = n;
smalloc.alloc(this.length, this);
}
SimpleData.prototype = { /* ... */ };
僅檢查 receiver
是否是非數組的對象。因此,可以分配擴展數據數據,不僅是普通對象。
function allocMe() { }
smalloc.alloc(3, allocMe);
// { [Function allocMe] '0': 0, '1': 0, '2': 0 }
v8 不支持給數組分配擴展數組對象,如果這么做,將會拋出。
你可以指定外部數組數據的類型。所有可用類型在 smalloc.Types
列出,例如:
var doubleArr = smalloc.alloc(3, smalloc.Types.Double);
for (var i = 0; i < 3; i++)
doubleArr = i / 10;
// { '0': 0, '1': 0.1, '2': 0.2 }
使用 Object.freeze
, Object.seal
和 Object.preventExtensions
不能凍結,封鎖,阻止對象的使用擴展數據擴展。
source
{Object} 分配了外部數組的對象sourceStart
{Number} 負責的起始位置dest
{Object} 分配了外部數組的對象destStart
{Number} 拷貝到目標的起始位置copyLength
{Number} 需要拷貝的長度從一個外部數組拷貝內存到另外一個,所有的參數都必填,否則會拋出異常。
var a = smalloc.alloc(4);
var b = smalloc.alloc(4);
for (var i = 0; i < 4; i++) {
a[i] = i;
b[i] = i * 2;
}
// { '0': 0, '1': 1, '2': 2, '3': 3 }
// { '0': 0, '1': 2, '2': 4, '3': 6 }
smalloc.copyOnto(b, 2, a, 0, 2);
// { '0': 4, '1': 6, '2': 2, '3': 3 }
copyOnto
會在內部自動檢測分配的長度,因此不必設置任何附加參數。
obj
Object釋放通過 smalloc.alloc
給對象分配的內存。
var a = {};
smalloc.alloc(3, a);
// { '0': 0, '1': 0, '2': 0 }
smalloc.dispose(a);
// {}
有利于減輕垃圾回收器的負擔,但是開發時候還是要小心。程序里可能會出現難以跟蹤的錯誤。
var a = smalloc.alloc(4);
var b = smalloc.alloc(4);
// perform this somewhere along the line
smalloc.dispose(b);
// now trying to copy some data out
smalloc.copyOnto(b, 2, a, 0, 2);
// now results in:
// RangeError: copy_length > source_length
調用 dispose()
,對象依舊擁有外部數據,例如 smalloc.hasExternalData()
會返回 true
。dispose()
不支持緩存,如果傳入將會拋出。
obj
{Object}如果 obj
擁有外部分配的內存,返回true
。
可分配的最大數量。同樣適用于緩存創建。
外部數組的類型,包含:
Int8
Uint8
Int16
Uint16
Int32
Uint32
Float
Double
Uint8Clamped