求助!假如我要派生下面一个结构体的 bytemuck::Pod 和 bytemuck::Zeroable 方法
#[derive(Debug,Clone, Copy,bytemuck::Pod,bytemuck::Zeroable)]
#[repr(C)]
pub struct View0{
pos:f32,
size:u128,
}
报出如下错误
source type: `View0` (192 bits)
target type: `TypeWithoutPadding` (160 bits)
通过 expand 发现问题出在如下自动派生的检查
const _: fn() = || {
struct TypeWithoutPadding([u8; ::core::mem::size_of::<f32>() + ::core::mem::size_of::<u128>()]);
let _ = ::core::mem::transmute::<View0, TypeWithoutPadding>;
};
这个检查要求结构体的所有成员属性大小之和等于结构体大小,由于我的结构体中间会为了保持内存对齐,而在pos和*size之间填充一些字节所以上述大小不相等、报错。
我想知道这个检查的意义,如下手动实现避免了检查会不会有什么影响?
unsafe impl bytemuck::Zeroable for View0{
}
unsafe impl bytemuck::Pod for View0 {
}
1
共 3 条评论, 1 页
评论区
写评论感谢大佬!
--
👇
xiaopengli89: - All fields in the struct must implement Pod
不满足第3条,有 padding 会导致有些环境(gpu)内存布局不一致
可以在每个系统内手动显式加上 padding 字段,保证内部布局一致
不满足第3条,有 padding 会导致有些环境(gpu)内存布局不一致