プリミティブ型 ポインタ
1.84.0 · Source
pub fn addr(self) -> usizeポインタの「アドレス」部分を取得する。
これは
self as usizeと似ているが、ポインタの起源が破棄され公開されない点において異なる。これが意味するのは、戻されたアドレスをキャストして再びポインタにすると起源のないポインタが生成され、その逆参照は未定義動作になるという事実だ。失われた情報を復元して逆参照可能なポインタを適切に得るには、with_addrかmap_addrを使え。もしこれらの API の使用が不可能、つまり必須となる起源つきのポインタを維持する手段がない場合、厳密な起源は適さないかもしれない。代わりにポインタ整数間のキャストまたは
expose_provenanceとwith_exposed_provenanceを使え。ただし、これらはコードに移植性の低下と Rust メモリモデルの順守をチェックするツールとの親和性の低下をもたらしてしまう。殆どのプラットフォームではバイト列全体でアドレスを表現するため、これは元のポインタと同じバイト列の値を生成するだろう。ポインタ内に追加情報を保存する必要のあるプラットフォームはポインタのアドレス部分のみを含む値を生成するために表現の変更を行うかもしれない。それが何を意味するかはプラットフォームでの定義による。
これは厳密な起源の API である。
1.84.0 · Source
pub fn with_addr(self, addr: usize) -> *const T与えられたアドレスと
selfの起源で新しいポインタを作成する。これは
addr as *const Tキャストと似ているが、selfの起源を新しいポインタにコピーする。これは単項の本質的なキャストの曖昧さを排除する。これは
wrapping_offsetを使いselfを与えられたアドレスへとオフセットするのと等価であり、そのため機能も制限も同じである。これは厳密な起源の API である。
1.84.0 · Source
pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> *const T
selfの起源を維持しながら、selfのアドレスから新しい値へとマップ操作をする事により新しいポインタを作成する。これは
with_addrの簡易版であり、詳しくはそちらのメソッドを参照されたい。これは厳密な起源の API である。