我正在编写一个Vulkan渲染器,我意识到我应该只接受repr(C)
类型,但据我所知,没有办法在编译时实际检查。
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);
我正在填充一个缓冲区,然后将其交给Vulkan使用,因此我认为这里的布局可能很重要。
repr(C)
类型。” -> 你能解释一下吗?你在某些方法中接受通用类型并需要它们是repr(C)
类型吗?为什么? - Lukas KalbertodtVertex
应该与着色器将要使用的 C 布局相匹配吧?我不太确定#[repr(C)]
是否也会因为不同的打包而导致不同的大小。 - Maik Klein