WebAssembly内存管理机制
WebAssembly内存管理机制WebAssembly的**线性内存(Linear Memory)**是WebAssembly和JS数据交互的重要桥梁 其采用页式内存管理(Page-based memory management) 1、核心概念:什么是“页”?在 Wasm 中,内存被划分为固定大小的连续单元,称为“页”。 页的大小是固定的:每页的大小为 64 KiB(即 65,536 字节)。这个值是由 WebAssembly 规范明确定义的,不可更改 线性内存模型:Wasm 使用一个单一的、线性的地址空间(称为“线性内存”)来存储所有数据。你可以把它想象成一个非常长的、从 0 开始编号的字节数组 内存的增长以页为单位:当 Wasm 模块需要更多内存时,它不能一次只申请一个字节,而是必须至少申请一页 不同于现代 OS 的虚拟内存空间,Wasm 的线性内存从设计上就是单线程、线性的,这使得其模型更适合嵌入式、高性能或安全受限环境 2、页式内存管理的关键机制当一个 Wasm 模块被实例化时,它的内存可以指定两个属性: initial:初始页数。内存一开始就会分配这么多页 ma...
WebAssembly关键概念及生命周期
WebAssembly关键概念及生命周期1、关键概念1.1 模块 定义: .wasm 二进制文件的编译后形态。它是 WebAssembly 代码的静态的、可移植的表示形式 类比: 一个ES6 模块的 .js 文件,或者一个动态链接库 (DLL / .so) 的编译后文件。它包含了代码、类型定义、导入导出声明等,但它本身还不是一个可以运行的程序 关键特性: 不可变: 一旦编译完成,模块内容就无法更改 可缓存: 模块可以被高效地缓存,因为其内容不会改变。浏览器可以将其缓存到 IndexedDB 中,下次直接使用,极大加快加载速度 可并行编译: 模块的编译可以在单独的 Web Worker 中进行,不阻塞主线程 可共享: 同一个模块可以被多个实例共享(见下文) 1.2 实例 定义: 一个已被实例化、具有状态的模块。它是一个在运行时、在特定上下文中被激活的模块 类比: 一个 ES6 模块的导入实例(例如 import * as myModule from './myModule.js' 中的 myModule 对象),或者一个加载到内存中的 DLL。它包含...
EM_ASM宏
EM_ASM宏 宏 用途 返回值 参数访问 EM_JS(return_type, function_name, (args), code) 比ES_ASM更加青大的替代品,用于执行JS代码 与return_type匹配 使用变量名 EM_ASYNC_JS(return_type, function_name, (args), code) 允许在JS实现中使用 async/await,C函数返回一个Promise 与return_type匹配 使用变量名 EM_ASM(code) 执行嵌入的 JS 代码 无 无 EM_ASM_ARGS(code, args...) 执行 JS 代码,可传参 无 使用 $0, $1… EM_ASM_INT(code, args...) 执行 JS 代码,可传参 int 使用 $0, $1… EM_ASM_DOUBLE(code, args...) 执行 JS 代码,可传参 double 使用 $0, $1… EM_ASM_INT_V(code) 执行 JS 代码 int 无 EM_ASM_DOUBLE_V(cod...
Emscripten基础
Emscripten基础Emscripten底层是LLVM编译器,作用就是将C/C++编译成asm.js **TIPS: **asm.js是有Mozilla提出的JS子集,更大程度优化以提高执行速度,可以直接对应编译成机器指令执行 0、VsCode配置Emscripten环境以macOS为例,需要在项目根目录下创建一个.vscode文件夹并创建c_cpp_properties.json 123456789101112131415161718{ "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFolder}/**", "/emcc安装路径/upstream/emscripten/system/include"...