プリミティブ型 ポインタ


1.84.0 · Source pub fn addr(self) -> usize

ポインタの「アドレス」部分を取得する。

これは self as usize と似ているが、ポインタの起源が破棄され公開されない点において異なる。これが意味するのは、戻されたアドレスをキャストして再びポインタにすると起源のないポインタが生成され、その逆参照は未定義動作になるという事実だ。失われた情報を復元して逆参照可能なポインタを適切に得るには、with_addrmap_addr を使え。

もしこれらの API の使用が不可能、つまり必須となる起源つきのポインタを維持する手段がない場合、厳密な起源は適さないかもしれない。代わりにポインタ整数間のキャストまたは expose_provenancewith_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 である。