Speicher: Wasm-Definition
Die memory Definition deklariert einen Block aus linearem Speicher in Einheiten von 64KiB-Seiten.
Probieren Sie es aus
(module
(import "console" "log" (func $log (param i32)))
(memory $my_mem 1 2) ;; start with one memory page, and max of 2 pages
(func $main
;; grow memory by 1 page
;; grow returns 1 for success and -1 for failure
;; will fail if you grow to more than 2 pages
(memory.grow $my_mem (i32.const 1))
call $log ;; log the result
)
(start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });
Syntax
memory name address_type min max
memory-
Der Typ der
memory-Definition. Muss immer zuerst angegeben werden. nameOptional-
Ein optionaler identifizierender Name für den Speicher. Dieser muss mit einem
$-Symbol beginnen, zum Beispiel$meine_speicher. Wird dies weggelassen, kann der Speicher durch seinen Index identifiziert werden, zum Beispiel0für den ersten Speicher im Wasm-Modul,1für den zweiten usw. address_typeOptional-
Ein Ganzzahl-Datentyp, der angibt, welchen Adresstyp der Speicher haben wird. Mögliche Werte sind:
i32-
Daten werden an 32-Bit-Adressen gespeichert. Zeiger, die zur Identifizierung von Speicheradressen verwendet werden (zum Beispiel beim Speichern oder Laden), werden
i32-Werte sein. i64-
Daten werden an 64-Bit-Adressen gespeichert. Zeiger, die zur Identifizierung von Speicheradressen verwendet werden (zum Beispiel beim Speichern oder Laden), werden
i64-Werte sein.
Wird dies weggelassen, ist der Standardwert für
address_typei32. min-
Die minimale Anzahl von 64KiB-Seiten im Speicher, was auch die anfängliche Anzahl von Seiten ist.
maxOptional-
Die maximale Anzahl von 64KiB-Seiten im Speicher.
Beschreibung
WebAssembly-Speicher bietet Roharbeitsspeicher für Wasm-Module. Die memory-Definition selbst deklariert den Datenspeicher, während data-Definitionen verwendet werden können, um einen Speicher mit Daten zu initialisieren. Zum Beispiel:
(module
(memory $my_mem 1 2)
(data $greeting (memory $my_mem) (i32.const 0) "Hello world")
;; ...
)
Jeder Speicher wird als Anzahl von "Seiten" definiert, wobei jede Seite 64KiB (65.536 Bytes) groß ist. Nach dem optionalen identifizierenden Speichernamen definieren die beiden Zahlenwerte die minimale (und anfängliche) Anzahl von Seiten und die maximale Anzahl von Seiten, die der Speicher enthalten kann. Die data-Definition ist ebenfalls benannt und spezifiziert einen Bezeichner, in dem die Daten gespeichert werden sollen. Ein Wasm-Modul kann mehrere Speicher enthalten, die jeweils durch Namen oder Index identifizierbar sind.
Wenn Sie nur einen Speicher in Ihrem Modul haben oder die Daten im ersten Speicher im Modul speichern möchten, können Sie den Speichernamen und Bezeichner weglassen, wie folgt:
(module
(memory 1 2)
(data $greeting (i32.const 0) "Hello world")
;; ...
)
Standardmäßig werden die Daten in Speicher 0 geschrieben.
Sobald ein memory erstellt wurde, stehen mehrere Speicheranweisungen zur Manipulation zur Verfügung. Weitere Einzelheiten zur Verwendung von Wasm-Speichern finden Sie in WebAssembly-Speicher.
Manipulation von Wasm-Speichern aus JavaScript
WebAssembly-Speicher können aus einem Wasm-Modul exportiert werden:
(module
(memory (export "memory") 1)
(data $greeting (i32.const 0) "Hello world")
;; ...
)
Im JavaScript-Host sind sie dann im entsprechenden exports-Objekt verfügbar, zum Beispiel:
WebAssembly.instantiateStreaming(fetch("module.wasm")).then((result) => {
const mem = result.instance.exports.memory;
// ...
});
Der Speicher wird durch eine JavaScript-Instanz des WebAssembly.Memory-Objekts repräsentiert, die mit typisierten Array-Objekten oder DataView-Objekten betrachtet und modifiziert werden kann. Siehe memory.init für ein Beispiel.
Sie können auch einen neuen memory mithilfe des JavaScript-Konstruktors WebAssembly.Memory() erstellen und in ein Wasm-Modul importieren.
Spezifikationen
Diese Funktion scheint in keiner Spezifikation definiert zu sein.>Browser-Kompatibilität
Siehe auch
- WebAssembly Speicheranweisungen
WebAssembly.MemoryJavaScript-API