You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用cfg为不同目标架构设置结构体属性?Wasm需16字节对齐

不同架构下结构体的差异化对齐实现

完全可以通过Rust的条件编译(cfg/cfg_attr)实现这个需求,下面提供两种简洁的写法:

方法一:分开定义结构体(直观但需重复字段)

直接针对wasm32和其他架构分别定义结构体,用cfg标记区分:

// wasm32架构下,16字节对齐的C风格结构体
#[cfg(target_arch = "wasm32")]
#[repr(c, align(16))]
struct Foo {
    a: u32,
    b: f64,
    // 其他字段...
}

// 非wasm32架构下,普通C风格结构体
#[cfg(not(target_arch = "wasm32"))]
#[repr(c)]
struct Foo {
    a: u32,
    b: f64,
    // 其他字段需和上面完全一致
}

方法二:用cfg_attr合并定义(推荐,无需重复字段)

利用cfg_attr属性,仅在wasm32架构下额外添加16字节对齐的要求,结构体只需定义一次:

#[repr(c)]
// 当目标架构是wasm32时,追加align(16)的repr属性
#[cfg_attr(target_arch = "wasm32", repr(align(16)))]
struct Foo {
    a: u32,
    b: f64,
    // 其他字段...
}

这种写法的本质是:

  • 在wasm32架构下,最终等价于#[repr(c, align(16))]
  • 在其他架构下,仅保留#[repr(c)]

验证对齐效果

可以通过std::mem::align_of函数验证对齐值:

fn main() {
    println!("Foo的对齐值: {}", std::mem::align_of::<Foo>());
}

编译为wasm32目标时会输出16,其他架构下输出对应C风格的默认对齐值。

内容的提问来源于stack exchange,提问作者sak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:00:58