Das WebAssembly.Memory
Objekt ist ein veränderbares ArrayBuffer
oder SharedArrayBuffer
, das rohe Bytes von Speicher hält, auf den von einer WebAssembly.Instance
zugegriffen wird.
Sowohl WebAssembly als auch JavaScript können Memory
Objekte erstellen. Wenn Sie auf den in JavaScript erstellten Speicher von WebAssembly aus zugreifen möchten oder umgekehrt, können Sie den Speicher aus dem Modul nach JavaScript exportieren oder Speicher von JavaScript in das Modul importieren, wenn es instanziiert wird.
Ursprünglich konnten Sie Speicheroperationen nur auf einem einzigen Speicher im Wasm-Modul ausführen, sodass es keinen wirklichen Sinn hatte, mehrere Memory
Objekte zu erstellen, auch wenn dies möglich war. Neuere Implementierungen erlauben es jedoch, dass WebAssembly Speicherbefehle auf einem spezifizierten Speicher arbeiten. Für weitere Informationen siehe Mehrere Speicher im Leitfaden Verstehen des WebAssembly-Textformats.
Hinweis: WebAssembly-Speicher ist immer im Little-Endian-Format, unabhängig von der Plattform, auf der es ausgeführt wird. Daher sollten Sie zur Portabilität Multi-Byte-Werte in JavaScript mithilfe von DataView
lesen und schreiben.
WebAssembly.Memory()
Erstellt ein neues Memory
Objekt.
Memory.prototype.buffer
Schreibgeschützt
Gibt den Puffer zurück, der im Speicher enthalten ist.
Memory.prototype.grow()
Erhöht die GröÃe der Speicherinstanz um eine angegebene Anzahl von WebAssembly-Seiten (jede ist 64KiB groÃ). Trennt den vorherigen buffer
.
Es gibt zwei Möglichkeiten, ein WebAssembly.Memory
Objekt zu erhalten. Der erste Weg ist, es aus JavaScript zu konstruieren. Das folgende Snippet erstellt eine neue WebAssembly-Speicherinstanz mit einer AnfangsgröÃe von 10 Seiten (640KiB) und einer maximalen GröÃe von 100 Seiten (6,4MiB). Ihre buffer
Eigenschaft wird ein ArrayBuffer
zurückgeben.
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
});
Das folgende Beispiel (siehe memory.html auf GitHub, und sehen Sie es sich auch live an) ruft die geladene "memory.wasm"-Bytecode-Datei ab und instanziiert sie mit 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. Beachten Sie die Verwendung von DataView
, um auf den Speicher zuzugreifen, sodass wir immer das Little-Endian-Format verwenden.
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);
});
Eine andere Möglichkeit, ein WebAssembly.Memory
Objekt zu erhalten, besteht darin, es von einem WebAssembly-Modul exportieren zu lassen. Dieser Speicher kann in der exports
Eigenschaft der WebAssembly-Instanz (nachdem der Speicher innerhalb des WebAssembly-Moduls exportiert wurde) zugegriffen werden. Das folgende Beispiel importiert einen Speicher, der aus WebAssembly mit dem Namen memory
exportiert wurde, und gibt dann das erste Element des Speichers aus, interpretiert als Uint32Array
.
WebAssembly.instantiateStreaming(fetch("memory.wasm")).then((obj) => {
const values = new DataView(obj.instance.exports.memory.buffer);
console.log(values.getUint32(0, true));
});
StandardmäÃig sind WebAssembly-Speicher nicht gemeinsam genutzt. Sie können einen gemeinsamen Speicher aus JavaScript erstellen, indem Sie im Initialisierungsobjekt des Konstruktors shared: true
übergeben:
const memory = new WebAssembly.Memory({
initial: 10,
maximum: 100,
shared: true,
});
Die buffer
Eigenschaft dieses Speichers wird einen SharedArrayBuffer
zurückgeben.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4