← 返回首页
WebAssembly.Memory()-Konstruktor - WebAssembly | MDN

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

WebAssembly.Memory()-Konstruktor

Baseline Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Oktober 2017 browserübergreifend verfügbar.

Der WebAssembly.Memory()-Konstruktor erstellt ein neues Memory-Objekt, dessen buffer-Eigenschaft ein größenveränderbares ArrayBuffer oder SharedArrayBuffer ist, das die Rohbytes des Speichers enthält, auf die eine WebAssembly.Instance zugreift.

Ein Speicherobjekt, das von JavaScript oder in WebAssembly-Code erstellt wurde, wird sowohl von JavaScript als auch von WebAssembly zugänglich und veränderlich sein, sofern der Code das Objekt erstellt hat oder das Objekt erhalten hat.

Sowohl WebAssembly als auch JavaScript können Memory-Objekte erstellen. Wenn Sie auf den in JS erstellten Speicher von Wasm oder umgekehrt zugreifen möchten, können Sie eine Referenz auf den Speicher von einer Seite an die andere übergeben.

In diesem Artikel

Syntax

js
new WebAssembly.Memory(memoryDescriptor)

Parameter

memoryDescriptor

Ein Objekt, das die folgenden Mitglieder enthalten kann:

address Optional

Ein Zeichenfolgewert, der den Adresstyp des Speichers angibt. Dies kann entweder "i32" oder "i64" sein. Der Standardwert ist "i32". Wenn address auf "i64" gesetzt ist, müssen initial und maximum, falls vorhanden, BigInt-Werte sein.

initial

Die anfängliche Größe des WebAssembly-Speichers, in Einheiten von WebAssembly-Seiten.

maximum Optional

Die maximale Größe, auf die der WebAssembly-Speicher wachsen darf, in Einheiten von WebAssembly-Seiten. Wenn vorhanden, fungiert der maximum-Parameter als Hinweis für die Engine, Speicher im Voraus zu reservieren. Die Engine kann diese Reservierungsanfrage jedoch ignorieren oder drosseln. Nicht gemeinsam genutzte WebAssembly-Speicher müssen kein maximum setzen, aber gemeinsam genutzte Speicher müssen es.

shared Optional

Ein boolescher Wert, der definiert, ob der Speicher ein gemeinsam genutzter Speicher ist oder nicht. Wenn auf true gesetzt, handelt es sich um einen gemeinsam genutzten Speicher. Der Standardwert ist false.

Hinweis: Eine WebAssembly-Seite hat eine konstante Größe von 65.536 Bytes, d.h. 64KiB.

Ausnahmen

TypeError

Wird ausgelöst, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

  • memoryDescriptor ist kein Objekt.
  • initial ist nicht angegeben.
  • shared ist vorhanden und true, aber maximum ist nicht angegeben.
RangeError

Wird ausgelöst, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

  • maximum ist angegeben und kleiner als initial.
  • address ist auf "i32" gesetzt oder weggelassen, und initial überschreitet 65.536 (2^16). 2^16 Seiten entsprechen 4GiB (2^16 * 64KiB), was der maximale Bereich ist, den ein Wasm-Modul mit 32-Bit-Adressierung adressieren kann.
  • Die Zuordnung schlägt fehl. Dies kann auftreten, wenn versucht wird, zu viel auf einmal zuzuordnen, oder wenn der User Agent anderweitig keinen Speicher mehr hat.

Beispiele

Erstellen einer neuen Memory-Instanz

Es gibt zwei Möglichkeiten, ein WebAssembly.Memory-Objekt zu erhalten: Es aus JavaScript zu konstruieren oder es von einem WebAssembly-Modul exportieren zu lassen.

Das folgende Beispiel (siehe memory.html auf GitHub und sehen Sie es sich auch live an) erstellt eine neue WebAssembly-Memory-Instanz mit einer anfänglichen Größe von 10 Seiten (640KiB) und einer maximalen Größe von 100 Seiten (6,4MiB). Das Beispiel lädt und instanziiert den geladenen Memory.wasm-Bytecode mithilfe der Funktion WebAssembly.instantiateStreaming(), während es den oben erstellten Speicher importiert. Anschließend speichert es einige Werte in diesem Speicher, exportiert eine Funktion und verwendet die exportierte Funktion, um diese Werte zu summieren. Die buffer-Eigenschaft des Memory-Objekts wird einen ArrayBuffer zurückgeben.

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); });

Erstellen eines gemeinsam genutzten Speichers

Standardmäßig sind WebAssembly-Speicher nicht gemeinsam genutzt. Sie können einen gemeinsam genutzten Speicher von JavaScript aus erstellen, indem Sie shared: true im Initialisierungsobjekt des Konstruktors übergeben:

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

Diese buffer-Eigenschaft des Speichers gibt einen SharedArrayBuffer zurück.

Verwenden einer 64-Bit-Adresse

Um einen Speicher mit einem 64-Bit-Adresstyp zu erstellen, übergeben Sie address: "i64". Die Werte für initial und maximum müssen BigInt-Werte sein:

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

Spezifikationen

Spezifikation
WebAssembly JavaScript Interface
# dom-memory-memory

Das shared-Attribut ist nur im Threading Proposal für WebAssembly dokumentiert und nicht Teil der offiziellen Spezifikationen.

Browser-Kompatibilität

JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.

Siehe auch