我目前正在编写一个Vulkan渲染器,我只是意识到我应该只接受类型为repr(C)
,但据我所知在编译时没有办法真正检查它。repr(C)和repr(rust)之间的区别是什么?
struct Vertex {
x: f32,
y: f32,
b: Box<f32>
}
#[repr(C)]
struct Vertex2 {
x: f32,
y: f32,
b: Box<f32>
}
fn to_bytes<T>(t: &T) -> &[u8]{
let p: *const T = t;
let p = p as *const u8;
unsafe{
std::slice::from_raw_parts(p, std::mem::size_of::<T>())
}
}
fn main() {
let v = Vertex{x: 42.0, y: 0.0, b: Box::new(42.0)};
let v2 = Vertex2{x: 42.0, y: 0.0, b: Box::new(42.0)};
println!("{:?}", to_bytes(&v));
println!("{:?}", to_bytes(&v2));
}
试了几次后,我终于可以看到repr(c)
和repr(rust)
,但只有当我用Box
之间的差异。
repr(C)
和repr(rust)
有什么区别?我可以假设,如果一个类型只包含其他POD类型,那么布局将与C中的相同?
例子:
let slice = base.device
.map_memory::<Vertex>(vertex_input_buffer_memory,
0,
vertex_input_buffer_info.size,
vk::MemoryMapFlags::empty())
.unwrap();
slice.copy_from_slice(&vertices);
我填,我交给福尔康一个缓冲区,所以我认为这里的布局可能是重要的。
“*我应该只接受类似'repr(C)'*” - >你能澄清一下吗?您在某些方法中接受泛型类型,并且需要这些类型为'repr(C)'?为什么? –
我不认为Rust会保证Rust将使用与C相同的数据表示。 – user4815162342
@LukasKalbertodt我不完全确定你的意思,但我在我的问题中添加了一个例子。这里的'Vertex'确实应该匹配着色器将要使用的C布局吗?我不太确定'#[repr(C)]'由于不同的包装会导致不同的尺寸。 –