评估指针与某些值对齐

问题描述 投票:0回答:1
I查看了Pointer的

aligned_offset

函数,但文档指出,它可以给出假否定性(始终返回

usize::MAX
),并且正确性不能依赖于此。 我根本不想摆弄对齐方式,我只想写一个主张,如果指针不结盟,这会感到恐慌。我的动机是,当使用某些低级CPU固有信息传递的指示器不一对准某些边界会导致CPU错误,我宁愿收到一个生锈的恐慌消息,指向引起其位置的位置而不是segfault。
一个示例断言(根据
aligned_offset

文档不正确):

#[repr(align(64))] struct A64(u8); #[repr(align(32))] struct A32(u8); #[repr(align(8))] struct A8(u8); fn main() { let a64 = [A64(0)]; let a32 = [A32(0)]; let a8 = [A8(0), A8(0)]; println!("Assert for 64 should pass..."); assert_alignment(&a64); println!("Assert for 32 should pass..."); assert_alignment(&a32); println!("Assert for 8, one of the following should fail:"); println!("- full array"); assert_alignment(&a8); println!("- offset by 8"); assert_alignment(&a8[1..]); } fn assert_alignment<T>(a: &[T]) { let ptr = a.as_ptr(); assert_eq!(ptr.align_offset(32), 0); }

rust游乐场

    

为了满足我自己的神经症,我去检查了

pointer::align_offset

pointers rust memory-alignment
1个回答
2
投票

在边缘案例上进行了很多仔细的工作(例如,const评估它总是返回usize::MAX

,同样,对于指向零尺寸类型的指针类似,如果不是2的功率,则会感到恐慌。但是,出于您的目的,实现的症结是
Herey:需要检查是否对齐。

Edit: thispr

正在添加一个

alignment
函数,它比简单的
(ptr as usize) % alignment == 0
(尽管它的核心仍然是逻辑)更可读性,更安全,更审查了)。 那时,要计算确切的偏移(可能是不可能的),这与此问题无关。
从而:

pointer::is_aligned_to

对于您的断言应该足够。 最重要的是,这证明当前的Rust Standard库不能针对任何不代表指针作为简单数字地址的任何内容,否则此功能将无法使用。在不太可能的情况下,Rust Standard库移植到Intel 8086或一些不代表指示器的怪异DSP,此功能必须更改。但实际上,您是否在乎那个假设?

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.