首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >repr(C)和repr(锈病)有什么区别?

repr(C)和repr(锈病)有什么区别?
EN

Stack Overflow用户
提问于 2017-03-16 09:50:23
回答 1查看 6.6K关注 0票数 13

我目前正在编写一个Vulkan呈现器,我刚刚意识到我应该只接受属于repr(C)的类型,但据我所知,在编译时无法实际检查这些类型。

代码语言:javascript
复制
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中相同吗?

示例:

代码语言:javascript
复制
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,所以我假设这里的布局可能很重要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 10:03:34

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

如果一个类型只包含其他POD类型,那么布局将与C中相同吗?

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42830493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档