gpt4 book ai didi

rust - Rust 中精确的内存布局控制?

转载 作者:行者123 更新时间:2023-11-29 07:41:10 24 4
gpt4 key购买 nike

据我所知,允许 Rust 编译器对结构的每个字段进行打包、重新排序和添加填充。如果需要,如何指定精确的内存布局?

在 C# 中,我有 StructLayout 属性,在 C/C++ 中,我可以使用各种编译器扩展。我可以通过检查预期值位置的字节偏移量来验证内存布局。

我想使用自定义着色器编写 OpenGL 代码,这需要精确的内存布局。有没有办法在不牺牲性能的情况下做到这一点?

最佳答案

the FFI guide 中所述,您可以向结构添加属性以使用与 C 相同的布局:

#[repr(C)]
struct Object {
a: i32,
// other members
}

而且您还可以打包结构:

#[repr(C, packed)]
struct Object {
a: i32,
// other members
}

为了检测内存布局是否正常,您可以初始化一个结构并通过将指针转换为整数来检查偏移量是否正常:

#[repr(C, packed)]
struct Object {
a: u8,
b: u16,
c: u32, // other members
}

fn main() {
let obj = Object {
a: 0xaa,
b: 0xbbbb,
c: 0xcccccccc,
};

// addr_of! used here due to unaligned references being UB: https://github.com/rust-lang/rust/issues/82523
let a_ptr: *const u8 = std::ptr::addr_of!(obj.a);
let b_ptr: *const u16 = std::ptr::addr_of!(obj.b);
let c_ptr: *const u32 = std::ptr::addr_of!(obj.c);

let base = a_ptr as usize;

println!("a: {}", a_ptr as usize - base);
println!("b: {}", b_ptr as usize - base);
println!("c: {}", c_ptr as usize - base);
}

输出:

a: 0
b: 1
c: 3

关于rust - Rust 中精确的内存布局控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271151/

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