rust 如何指定常量的对齐方式

busg9geu  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(227)

我想实现这样的目标:

#[repr(align(4))]
const SPV_CODE: &[u8] = include_bytes!('my-shader.spv');

如何确保常量与四的乘数地址对齐?
编辑:为了清楚起见,我希望嵌入的字节本身对齐为4个字节。

jyztefdp

jyztefdp1#

您可以使用一个只包含这个切片的特定结构(或者一个数组,我不知道您需要什么),然后将对齐约束放在该结构上。
因为我不知道你是否想对齐切片(即胖指针)或其引用(指向)的所包括字节,请找到以下两个解决方案以表达对齐约束。

#[repr(align(64))]
struct SpvCodeSlice<'a>(&'a [u8]);

const SPV_CODE_SLICE: SpvCodeSlice =
    SpvCodeSlice(include_bytes!("my-shader.spv"));

fn show_slice_alignment() {
    let slice_struct_ptr = &SPV_CODE_SLICE as *const _;
    let slice_bytes_ptr = SPV_CODE_SLICE.0.as_ptr();
    println!("slice_struct_ptr: {:?}", slice_struct_ptr);
    println!("slice_bytes_ptr: {:?}", slice_bytes_ptr);
    let slice_struct_addr = slice_struct_ptr as usize;
    let slice_bytes_addr = slice_bytes_ptr as usize;
    println!("slice_struct_addr%64: {:?}", slice_struct_addr % 64); // zero every time
    println!("slice_bytes_addr%64: {:?}", slice_bytes_addr % 64); // not zero!
}

#[repr(align(64))]
struct SpvCodeArray<const N: usize>([u8; N]);

const BYTES_LEN: usize = include_bytes!("my-shader.spv").len();
const SPV_CODE_ARRAY: SpvCodeArray<BYTES_LEN> =
    SpvCodeArray(*include_bytes!("my-shader.spv"));

fn show_array_alignment() {
    let array_struct_ptr = &SPV_CODE_ARRAY as *const _;
    let array_bytes_ptr = SPV_CODE_ARRAY.0.as_ptr();
    println!("array_struct_ptr: {:?}", array_struct_ptr);
    println!("array_bytes_ptr: {:?}", array_bytes_ptr);
    let array_struct_addr = array_struct_ptr as usize;
    let array_bytes_addr = array_bytes_ptr as usize;
    println!("array_struct_addr%64: {:?}", array_struct_addr % 64); // zero every time
    println!("array_bytes_addr%64: {:?}", array_bytes_addr % 64); // zero every time
}

fn main() {
    show_slice_alignment();
    println!("~~~~");
    show_array_alignment()
}
/*
slice_struct_ptr: 0x55e10101d1c0
slice_bytes_ptr: 0x55e10100f05b
slice_struct_addr%64: 0
slice_bytes_addr%64: 27
~~~~
array_struct_ptr: 0x55e10100f100
array_bytes_ptr: 0x55e10100f100
array_struct_addr%64: 0
array_bytes_addr%64: 0
*/

相关问题