我想在我的 Astro 应用程序中使用我用 Rust 编写的 Web-Assembly 模块。我正在使用 TypeScript 和以下内容astro.config.mjs:
import { defineConfig } from "astro/config";
import wasm from "vite-plugin-wasm";
import topLevelAwait from "vite-plugin-top-level-await";
import tailwind from "@astrojs/tailwind";
import react from "@astrojs/react";
export default defineConfig({
integrations: [wasm(), tailwind(), react()],
vite: {
plugins: [wasm(), topLevelAwait()],
},
});
Run Code Online (Sandbox Code Playgroud)
在文件中使用 wasm 的代码functions.ts如下所示:
import { greet } from "dices";
export function hello(): void {
let g: string = greet();
console.log(g);
}
Run Code Online (Sandbox Code Playgroud)
类型检查一切正常,但是在运行时npm run dev遇到以下错误:
error WebAssembly.instantiate(): BufferSource argument is …Run Code Online (Sandbox Code Playgroud) 我很困惑为什么以下代码中 Vec<i64> 和 VecEnum 的大小相同:
pub enum VecEnum {
Abc,
Vec(Vec<i64>),
}
pub enum IntEnum {
Abc,
Int(i64),
}
pub fn main() {
println!("IntEnum: {} bytes", core::mem::size_of::<IntEnum>());
println!("i64: {} bytes", core::mem::size_of::<i64>());
println!("VecEnum: {} bytes", core::mem::size_of::<VecEnum>());
println!("Vec<i64>: {} bytes", core::mem::size_of::<Vec<i64>>());
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
IntEnum: 16 bytes
i64: 8 bytes
VecEnum: 24 bytes
Vec<i64>: 24 bytes
Run Code Online (Sandbox Code Playgroud)
对于 i64,它的行为符合预期:具有 i64 变体的枚举需要额外的空间来编码枚举标记。但为什么 Vec 的情况并非如此,它仅由堆栈内存的 3 个 8 字节值(ptr、len、capacity)组成?
有人可以解释一下内存布局是如何工作的以及幕后发生了什么吗?