// some C code
struct Something {
int xxx;
int yyy;
int zzz[];
}
好的,垃圾rust已经炸了,因为垃圾rust不支持VLA和这玩意儿,所以这个应该怎么写呢?!
#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
xxx: i32,
yyy: i32,
zzz: *mut i32
}
所以这样行不行...
意思虽然是这个意思,可是size不一样,已知C的size是8(i32 * 2), 但是这个的size是16(i32 * 2 + 64bit pointer)
#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
xxx: i32,
yyy: i32,
zzz: [i32]
}
这样看起来是行了,
我们上网查了查memory layout也对的上
可是 [i32]
是 ?Sized
所以不能 Copy
和 Clone
,我们就基本写不了代码...
最后我们可以使用C的一些奇技淫巧:零长度数组
这个东西在算layout时可谓是非常的好用,在rust里面也照样发挥余光!
#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
xxx: i32,
yyy: i32,
_zzz: [i32; 0]
}
impl Something {
unsafe fn zzz(&self, len: usize) -> &[i32] {
std::slice::from_raw_parts(self._zzz.as_ptr(), len)
}
unsafe fn zzz_mut(&self, len: usize) -> &[i32] {
std::slice::from_raw_parts_mut(self._zzz.as_mut_ptr(), len)
}
}
行...太丑了,凑合用吧