本文简要介绍rust语言中 Macro std::ptr::addr_of
的用法。
用法
pub macro addr_of($place : expr) {
...
}
创建指向位置的const
原始指针,而不创建中间引用。
创建参考&
/&mut
仅当指针正确对齐并指向初始化数据时才允许。对于不满足这些要求的情况,应使用原始指针。然而,&expr as *const _
在将其转换为原始指针之前创建一个引用,并且该引用与所有其他引用遵循相同的规则。该宏可以创建一个原始指针没有首先创建一个参考。
但是请注意,addr_of!(expr)
中的expr
仍然遵守所有常规规则。特别是,addr_of!(*ptr::null())
是未定义行为,因为它取消引用空指针。
示例
use std::ptr;
#[repr(packed)]
struct Packed {
f1: u8,
f2: u16,
}
let packed = Packed { f1: 1, f2: 2 };
// `&packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
let raw_f2 = ptr::addr_of!(packed.f2);
assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
有关如何创建指向未初始化数据的指针,请参阅 addr_of_mut
。使用addr_of
这样做没有多大意义,因为只能读取数据,这将是未定义的行为。
相关用法
- Rust addr_of_mut用法及代码示例
- Rust assert_ne用法及代码示例
- Rust array.map用法及代码示例
- Rust assert_matches用法及代码示例
- Rust alloc_zeroed用法及代码示例
- Rust array.split_array_ref用法及代码示例
- Rust array用法及代码示例
- Rust array.zip用法及代码示例
- Rust align_of用法及代码示例
- Rust always_abort用法及代码示例
- Rust assert_eq用法及代码示例
- Rust array.split_array_mut用法及代码示例
- Rust available_parallelism用法及代码示例
- Rust abort用法及代码示例
- Rust align_of_val用法及代码示例
- Rust array.each_mut用法及代码示例
- Rust assert用法及代码示例
- Rust array.each_ref用法及代码示例
- Rust args用法及代码示例
- Rust alloc用法及代码示例
- Rust args_os用法及代码示例
- Rust align_of_val_raw用法及代码示例
- Rust UdpSocket.set_multicast_loop_v6用法及代码示例
- Rust i64.overflowing_add_unsigned用法及代码示例
- Rust Box.downcast用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Macro std::ptr::addr_of。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。