rust语言属性#[repr(c)]

在 Rust 语言中,#[repr(C)] 是一个重要的属性(attribute)用于控制类型(主要是结构体 struct 和枚举 enum)在内存中的布局,使其与 C 编程语言的内存布局规则兼容。
默认情况下,Rust 编译器会自由优化内存布局(#[repr(Rust)],包括重新排列结构体字段以最小化填充(padding)和优化访问速度。然而,这种优化后的布局在需要跨语言交互(即 外部函数接口 FFI)时是不可预测且不安全的。
#[repr(C)] 属性的核心作用包括:
  • 保证字段顺序: 它确保结构体中的字段按照源代码中声明的顺序严格排列在内存中,就像 C 语言编译器所做的那样。
  • 遵循 C ABI: 它使用目标平台的 C 语言应用二进制接口(ABI)规则来确定字段的大小、对齐和必要的填充字节。
  • 实现 FFI 互操作性: 任何需要在 Rust 代码和 C、C++ 或其他期望 C 兼容布局的语言之间共享的数据类型,都必须标记为 #[repr(C)]
示例
考虑一个简单的结构体,展示 #[repr(Rust)](默认)和 #[repr(C)] 布局的区别(具体大小和对齐取决于平台):
Rust 默认布局 (#[repr(Rust)])
编译器可能会重新排列字段以减少内存占用。例如,它可能会将 u8 放在需要较小对齐的字段旁边。
struct MyStructRust {
    a: u32, // 4 字节
    b: u64, // 8 字节
    c: u8,  // 1 字节
}
// 编译器可能会优化布局,总大小可能小于 4+8+1+padding
C 兼容布局 (#[repr(C)])
字段顺序固定,并遵循 C 语言的对齐规则插入填充。
rust
#[repr(C)]
struct MyStructC {
    a: u32, // 偏移量 0-3
    b: u64, // 偏移量 8-15 (可能在 a 后面插入 4 字节填充以满足 u64 对齐)
    c: u8,  // 偏移量 16 (可能在 b 后面插入 0 或更多字节填充)
}
// 总大小会严格按照 C 语言规则计算,通常更大。
更多关于 Rust 内存布局的详细信息,可以查阅 Rust 秘典(The Rustonomicon) 或 Rust 参考手册
 
 
posted @ 2025-12-05 15:53  PKICA  阅读(0)  评论(0)    收藏  举报