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.
Syntax
new WebAssembly.Memory(memoryDescriptor)
Parameter
memoryDescriptor-
Ein Objekt, das die folgenden Mitglieder enthalten kann:
addressOptional-
Ein Zeichenfolgewert, der den Adresstyp des Speichers angibt. Dies kann entweder
"i32"oder"i64"sein. Der Standardwert ist"i32". Wennaddressauf"i64"gesetzt ist, müsseninitialundmaximum, falls vorhanden,BigInt-Werte sein. initial-
Die anfängliche Größe des WebAssembly-Speichers, in Einheiten von WebAssembly-Seiten.
maximumOptional-
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 keinmaximumsetzen, aber gemeinsam genutzte Speicher müssen es. -
Ein boolescher Wert, der definiert, ob der Speicher ein gemeinsam genutzter Speicher ist oder nicht. Wenn auf
truegesetzt, handelt es sich um einen gemeinsam genutzten Speicher. Der Standardwert istfalse.
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:
memoryDescriptorist kein Objekt.initialist nicht angegeben.sharedist vorhanden undtrue, abermaximumist nicht angegeben.
RangeError-
Wird ausgelöst, wenn mindestens eine der folgenden Bedingungen erfüllt ist:
maximumist angegeben und kleiner alsinitial.addressist auf"i32"gesetzt oder weggelassen, undinitialüberschreitet65.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.
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:
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:
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.