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

View in English Always switch to English

WebAssembly.Memory.prototype.grow()

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2017年10月以降、すべてのブラウザーで利用可能です。

grow()WebAssembly.Memory オブジェクトのプロトタイプメソッドで、指定した WebAssembly ページの数だけメモリーインスタンスの大きさを拡張します。

構文

js
grow(delta)

引数

delta

メモリーを拡大する WebAssembly ページ数 (それぞれは 64KiB の大きさ)。 アドレス型が "i64" のメモリーについては、この値は BigInt である必要があります。

返値

以前のメモリーの大きさを、 WebAssembly ページ単位で返します。 アドレス型が "i64" のメモリーについては、この値は BigInt である必要があります。

例外

  • RangeError: 現在のサイズに delta を追加した値が、メモリーインスタンスの最大サイズ容量を超える場合。

grow の使用

以下の例では、新しい WebAssembly メモリーインスタンスを初期サイズ 1 ページ (64KiB)、最大サイズ 10 ページ (640KiB) で作成します。

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

それから、インスタンスを 1 ページ分拡張することができます。

js
const bytesPerPage = 64 * 1024;
console.log(memory.buffer.byteLength / bytesPerPage); // "1"
console.log(memory.grow(1)); // "1"
console.log(memory.buffer.byteLength / bytesPerPage); // "2"

なお、ここでの grow() の返値は直前の WebAssembly ページ数です。

64 ビットアドレスの使用

アドレス型が "i64" のメモリーについては、長整数 (BigInt) の値を grow() に渡してください:

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

console.log(memory.grow(1n)); // 1n

伸長に伴う脱落

grow を呼び出すたびに、古い buffer への参照は、たとえ grow(0) の場合であってもすべて解除されます¥。 参照の解除とは、ArrayBufferbyteLength が 0 になり、JavaScript からアクセス可能なバイトができなったたことを意味します。 grow を呼び出した後、buffer プロパティにアクセスすると、正しい長さの ArrayBuffer が返されます。

js
const memory = new WebAssembly.Memory({
  initial: 1,
});
const oldMemoryView = new Uint8Array(memory.buffer);
memory.grow(1);
// 配列は空
console.log(oldMemoryView); // Uint8Array []
js
const memory = new WebAssembly.Memory({
  initial: 1,
});
memory.grow(1);
const currentMemoryView = new Uint8Array(memory.buffer);
// 配列はゼロで埋められる
console.log(currentMemoryView); // Uint8Array(131072) [ 0, 0, 0, ... ]
// 131072 = 64KiB * 2

共有 Memory インスタンスの場合、初期の buffer(この場合は SharedArrayBuffer となります)は切り離されることはなく、その長さが更新されないだけです。拡張後の buffer プロパティへのアクセスでは、より大きな SharedArrayBuffer が返され、Memory の伸長前よりも広いメモリー範囲にアクセスすることがあります。buffer プロパティから取得されるすべての SharedArrayBuffer は、同じメモリアドレス範囲の先頭を参照するため、同じデータを操作することになります。

仕様書

仕様書
WebAssembly JavaScript Interface
# dom-memory-grow

ブラウザーの互換性

関連情報