小编Tad*_*rle的帖子

如何在 TypeScript 中将 Astro 与 WASM 结合使用

我想在我的 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)

reactjs webassembly wasm-pack vite astrojs

3
推荐指数
1
解决办法
1165
查看次数

为什么具有 Vec<i64> 变体的枚举没有内存开销?

我很困惑为什么以下代码中 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)组成?

有人可以解释一下内存布局是如何工作的以及幕后发生了什么吗?

memory enums rust

2
推荐指数
1
解决办法
144
查看次数

标签 统计

astrojs ×1

enums ×1

memory ×1

reactjs ×1

rust ×1

vite ×1

wasm-pack ×1

webassembly ×1