このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

WebAssembly.Memory

WebAssembly.Memory オブジェクトはサイズ変更可能な ArrayBuffer または SharedArrayBuffer であり、WebAssembly.Instance からアクセスする生のバイト列のメモリーを保持します。

WebAssembly と JavaScript の両方が Memory オブジェクトを作成できます。 WebAssembly から JavaScript で作成されたメモリーにアクセスしたい場合、あるいはその逆の場合、モジュールから JavaScript へメモリーをエクスポートするか、モジュールが インスタンス化 される際に JavaScript からモジュールへメモリーをインポートすることができます。

当初、 Wasm モジュールでは単一のメモリーに対してのみメモリ操作を実行できたため、複数の Memory オブジェクトを作成することは可能でしたが、そうする意味はありませんでした。 最新の実装では、WebAssemblyのメモリー命令が指定されたメモリーを操作できることになります。 詳細の情報については、『WebAssembly テキスト形式の理解』の複数のメモリーを参照してください。

メモ: WebAssemblyのメモリーは、動作するプラットフォームにかかわらず、常にリトルエンディアン形式です。したがって、移植性を確保するためには、JavaScript でマルチバイト値を読み書きする際は DataView を使用する必要があります。

コンストラクター

WebAssembly.Memory()

新しい Memory オブジェクトを生成します。

インスタンスプロパティ

Memory.prototype.buffer 読取専用

メモリーに格納されているバッファーを返します。

インスタンスメソッド

Memory.prototype.grow()

指定した WebAssembly ページ (64KiB で 1 単位) の数でメモリーのインスタンスのサイズを増やします。

新しい Memory オブジェクトの生成

WebAssembly.Memory オブジェクトを取得する方法は 2 つあります。 1 つ目は JavaScript から生成する方法です。以下の例では、初期サイズが 10 ページ (640KiB) 、最大サイズが 100 ページ (6.4MiB) で新しい WebAssembly Memory インスタンスを生成しています。その buffer プロパティは ArrayBuffer を返します。

js
const memory = new WebAssembly.Memory({
  initial: 10,
  maximum: 100,
});

次の例では (GitHub 上の memory.html および実行例も参照)、 "memory.wasm" バイトコードを WebAssembly.instantiateStreaming() メソッドを使用して読み込んでインスタンス化し、その上の行で生成されたメモリーにインポートします。それから、メモリーにいくつかの値を格納し、関数をエクスポートして使用し、それらの値を合計します。DataView を使用してメモリーにアクセスしているため、常にリトルエンディアン形式が使用される点に注意してください。

js
const memory = new WebAssembly.Memory({
  initial: 10,
  maximum: 100,
});

WebAssembly.instantiateStreaming(fetch("memory.wasm"), {
  js: { mem: memory },
}).then((obj) => {
  const summands = new DataView(memory.buffer);
  for (let i = 0; i < 10; i++) {
    summands.setUint32(i * 4, i, true); // WebAssembly is little endian
  }
  const sum = obj.instance.exports.accumulate(0, 10);
  console.log(sum);
});

WebAssembly.Memory オブジェクトを取得する 2 つ目の方法は、 WebAssembly モジュールによってエクスポートされることです。このメモリーは WebAssembly インスタンスの exports プロパティで (メモリーが WebAssembly モジュール内でエクスポートされた後に) アクセスできます。次のスニペットは、 WebAssembly からエクスポートされたメモリーを memoryという名前でインポートし、メモリーの最初の要素を Uint32Array として解釈して表示しています。

js
WebAssembly.instantiateStreaming(fetch("memory.wasm")).then((obj) => {
  const values = new DataView(obj.instance.exports.memory.buffer);
  console.log(values.getUint32(0, true));
});

共有メモリーの作成

デフォルトでは、 WebAssembly のメモリーは共有されていません。共有メモリーを JavaScript で作成するには、コンストラクターの初期化オブジェクトに shared: true を渡します。

js
const memory = new WebAssembly.Memory({
  initial: 10,
  maximum: 100,
  shared: true,
});

このメモリーの buffer プロパティは SharedArrayBuffer を返します。

64 ビットアドレスの使用

次のスニペットは、64 ビットのアドレス型を持つ新しい WebAssembly メモリーインスタンスを作成します。 initial および maximum の値は、BigInt の値でなければなりません:

js
const memory = new WebAssembly.Memory({
  address: "i64",
  initial: 1n,
  maximum: 10n,
});

仕様書

仕様書
WebAssembly JavaScript Interface
# memories
Unknown specification

ブラウザーの互換性

webassembly.api.Memory

webassembly.multiMemory

関連情報