gpt4 book ai didi

rust - repr(C) 和 repr(rust) 有什么区别?

转载 作者:行者123 更新时间:2023-11-29 07:48:14 28 4
gpt4 key购买 nike

我目前正在编写一个 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));
}

Playground

经过几次尝试,我终于看出了 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);

Source

我正在填充交给 Vulkan 的缓冲区,因此我认为此处的布局可能很重要。

最佳答案

您在程序输出中看到的差异不是由于内存布局。 Box<T> heap 分配并存储指向堆内容的指针,因此您要打印的是指针。作为Box<T>不执行任何实习/对象池,这两个地址当然是不同的。可能有点令人困惑的是地址彼此如此接近。我猜想这与 Rust 使用的分配器 jmalloc 有关,它有用于小分配的密集池。

Can I assume that if a type only contains other POD types, then the layout will be the same as in C?

不。您几乎不能对 Rust 类型的内存布局做出任何假设。这是有意不指定的,以允许优化,例如字段重新排序。即使现在repr(Rust)火柴repr(C)非常接近,你不能假设它会永远这样。

关于rust - repr(C) 和 repr(rust) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42830493/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com