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游乐场
为了满足我自己的神经症,我去检查了
在边缘案例上进行了很多仔细的工作(例如,const
评估它总是返回usize::MAX
,同样,对于指向零尺寸类型的指针类似,如果不是2的功率,则会感到恐慌。但是,出于您的目的,实现的症结是Herey:需要检查是否对齐。 Edit: thispr
正在添加一个
alignment
函数,它比简单的(ptr as usize) % alignment == 0
(尽管它的核心仍然是逻辑)更可读性,更安全,更审查了)。
那时,要计算确切的偏移(可能是不可能的),这与此问题无关。
从而:
pointer::is_aligned_to
对于您的断言应该足够。 最重要的是,这证明当前的Rust Standard库不能针对任何不代表指针作为简单数字地址的任何内容,否则此功能将无法使用。在不太可能的情况下,Rust Standard库移植到Intel 8086或一些不代表指示器的怪异DSP,此功能必须更改。但实际上,您是否在乎那个假设?