P.UNS.FFI.13 自定义数据类型要保证一致的数据布局
【描述】
Rust 编译器为了优化内存布局,会对结构体字段进行重排。所以在 FFi 边界,应该注意结构体内存布局和 C 语言的一致。
关于 如何选择合适的 repr
属性可参考:P.UNS.MEM.01
以下是不适合用于和 C 语言交互的类型:
- 没有使用任何
#[repr( )]
属性修饰的自定义类型 - 动态大小类型 (dynamic sized type)
- 指向动态大小类型对象的指针或引用 (fat pointers)
- str 类型、tuple 元组、闭包类型
【正例】
#![allow(unused)] fn main() { #[repr(C)] struct Data { a: u32, b: u16, c: u64, } #[repr(C, packed)] struct PackedData { a: u32, b: u16, c: u64, } }