WebAssembly.Memory()
WebAssembly.Memory
オブジェクトはサイズ変更可能な ArrayBuffer
または SharedArrayBuffer
であり、 WebAssembly Instance
からアクセスする生のバイト列のメモリーを持ちます。
JavaScript または WebAssembly コードから生成されたメモリーは JavaScript と WebAssembly のどちらからもアクセス、変更が可能になります。
コンストラクター
WebAssembly.Memory()
-
新しい
Memory
オブジェクトを生成します。
インスタンスプロパティ
Memory.prototype.buffer
-
メモリーに格納されているバッファーを返すアクセサープロパティです。
インスタンスメソッド
Memory.prototype.grow()
-
指定した WebAssembly ページ (64KB で 1 単位) の数でメモリーのインスタンスのサイズを増やします。
例
新しい Memory オブジェクトの生成
WebAssembly.Memory
オブジェクトを取得する方法は 2 つあります。 1 つ目は JavaScript から生成する方法です。以下の例では、初期サイズが 10 ページ (640KiB) 、最大サイズが 100 ページ (6.4MiB) で新しい WebAssembly Memory インスタンスを生成しています。その buffer
プロパティは ArrayBuffer
を返します。
var memory = new WebAssembly.Memory({ initial: 10, maximum: 100 });
次の例では (GitHub 上の memory.html および実行例も参照)、 memory.wasm バイトコードを WebAssembly.instantiateStreaming()
メソッドを使用して読み込みんでインスタンス化し、その上の行で生成されたメモリーにインポートします。それから、メモリーにいくつかの値を格納し、関数をエクスポートして使用し、いくつかの値を合計します。
WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
js: { mem: memory },
}).then((obj) => {
var i32 = new Uint32Array(memory.buffer);
for (var i = 0; i < 10; i++) {
i32[i] = i;
}
var sum = obj.instance.exports.accumulate(0, 10);
console.log(sum);
});
WebAssembly.Memory オブジェクトを取得する 2 つ目の方法は、 WebAssembly モジュールによってエクスポートされることです。このメモリーは WebAssembly インスタンスの exports
プロパティで (メモリーが WebAssembly モジュール内でエクスポートされた後に) アクセスできます。次のスニペットは、 WebAssembly からエクスポートされたメモリーを memory
という名前でインポートし、メモリーの最初の要素を Uint32Array として解釈して表示しています。
WebAssembly.instantiateStreaming(fetch("memory.wasm")).then((obj) => {
var i32 = new Uint32Array(obj.instance.exports.memory.buffer);
console.log(i32[0]);
});
共有メモリーの作成
既定では、 WebAssembly のメモリーは共有されていません。共有メモリーを作成するには、コンストラクター
の初期化オブジェクトに shared: true
を渡します。
let memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
このメモリーの buffer
プロパティは SharedArrayBuffer
を返します。
仕様書
Specification |
---|
WebAssembly JavaScript Interface # memories |
Unknown specification |
ブラウザーの互換性
webassembly.api.Memory
BCD tables only load in the browser
webassembly.multiMemory
BCD tables only load in the browser