如何用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
相关产品推荐
相关产品推荐

