< 返回版块

Wuyan 发表于 2022-05-15 14:23

Tags:bytemuck,Pod,Zeroable

求助!假如我要派生下面一个结构体的 bytemuck::Podbytemuck::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 {
    
}

评论区

写评论
作者 Wuyan 2022-05-15 19:24

感谢大佬!

--
👇
xiaopengli89: - All fields in the struct must implement Pod

  • The struct must be #[repr(C)] or #[repr(transparent)]
  • The struct must not contain any padding bytes
  • The struct contains no generic parameters

不满足第3条,有 padding 会导致有些环境(gpu)内存布局不一致

xiaopengli89 2022-05-15 16:40

可以在每个系统内手动显式加上 padding 字段,保证内部布局一致

xiaopengli89 2022-05-15 16:39
  • All fields in the struct must implement Pod
  • The struct must be #[repr(C)] or #[repr(transparent)]
  • The struct must not contain any padding bytes
  • The struct contains no generic parameters

不满足第3条,有 padding 会导致有些环境(gpu)内存布局不一致

1 共 3 条评论, 1 页