Rust in Action Notes 第 6 章 メモリ

  1. Option<T>Rust では型は null ポインター最適化を使用して、コンパイルされたバイナリ内で型が 0 バイトを占めるようにします。None変数はnull ポインタでnull pointer表されます。
  2. メモリ アドレス、ポインタ、参照の違い。メモリ アドレスはメモリ内のバイトを指し、アセンブリ言語によって提供される抽象化です。ポインタ (生ポインタ (生ポインタ) とも呼ばれます) は、特定のデータ型を指すメモリ アドレスであり、ポインタは高級言語によって提供される抽象化です。参照はポインタです。動的型では、参照にはポインタといくつかの追加保証が含まれます。参照は Rust によって提供される抽象化です。
  3. Rust の参照にはポインタよりも多くの利点があります: 参照は常に有効なデータを指します; 参照のバイト配置はコンパクトなので、CPU の高速読み取りに役立ちます; 参照は可変長データ型の長さの保証を提供できます 内部ポインタ自体に加えて、参照される構造体はプログラムがメモリ範囲外で実行されないことを保証するデータ長変数も提供します。
  4. {:p}変数インストール ポインターを出力したり、そのメモリ アドレスを出力したりできます。
  5. コード リスト 6.3 は、u8 配列から文字列への変換の 2 つの形式を示しています。 b 変数は最初に に変換String::from_raw_parts(ptr, size, capa)され、次に に変換されます。 c 変数は、 で終わる C 言語型の文字列を取得することで CStr 外部インターフェイスを導入します。 b 変数と c 変数は両方とも、最初に変換に必要な対応するポインタ型に変換する必要があります。[u8; 10]*const u8*mut u8CStr::from_ptr(c_ptr)\0[u8, n]*const u8
  6. Rustの生ポインタは不変の生ポインタと自由に変換できる可変の生ポインタの2種類*const T分かれており、Rustのリファレンスでコンパイルした結果が生ポインタとなり、実際の動作においては危険なくネイキッドポインタの性能が得られます。*mut T&mut T and &T
  7. ネイキッド ポインターを使用する理由: システムが OS 関数を呼び出す必要がある場合、または一部のサードパーティ コードでネイキッド ポインターが必要な場合 (通常は C で記述された一部のプログラムへの外部呼び出し)、複数の場所から同時にデータにアクセスする必要があり、実行時のパフォーマンス要件が非常に高い場合に、避けられない使用。
  8. C++ のスマート ポインターは Rust に対応しますcore::ptr::{Unique, Shared, Weak}。ファット ポインター (ファット ポインター) は通常、シン ポインター (シン ポインター。通常、使用幅が 1 つだけのネイキッド ポインターも指します) よりも大きいメモリ レイアウトを指します。通常、使用幅が 2 つ以上です。
  9. core::ptr::Uniqueこれは Rust の構成要素でありString, Box<T>独自のスマート ポインタを実装したい場合は、これらのスマート ポインタの実装の詳細を参照できます。core::ptr::SharedRc<T>, Arc<T>
  10. std::rc::Weak, std::arc::Weakこれは、内部で相互に指すデータ構造に使用でき、循環ポインタの問題を回避します。alloc::raw_vec::RawVec実装ではVec<T>, VecDeq<T>、あらゆるタイプのデータにメモリをインテリジェントに割り当てて再利用できます。std::cell::UnsafeCell実装ではCell<T>, RefCell<T>、内部可変性 (内部可変性) を提供します。
  11. 「疑わしい場合はスタックを優先する」とは、データをヒープに置くべきかスタックに置くべきかわからない場合、スタックの方が速いため、最初にスタックに置くことを意味します。この文の Rust バージョンでは、つまり、Sized 機能を実装する型が最初にスタックに格納されますWhen in doulbe, use types that implement Sized
  12. 関数が&str, String2 種類のパラメータを同時に受け入れるようにする方法は、パラメータ テンプレートを使用して<T: AsRef<str>>パラメータ T を str 参照として呼び出すことができることを示し、.as_ref().len()メソッドを呼び出すことができます。詳細については、189 ページを参照してください。
  13. 表 6.1 はスタックとヒープの簡単な比較を示していますが、この表は Unsafe なしの Rust ではヒープを安全に使用できることを示していることに注意してください。
    表6.1
  14. ヒープメモリ割り当てを最適化するためのいくつかの一般的な方法: 事前に十分な領域を割り当て、0 に初期化し、使用時にゼロ以外の値に変更するこの方法は危険であり、Rust のライフサイクル チェックを引き起こす可能性があります。必要な領域をより効率的に割り当てることができるプログラム用のアロケータを自分で設計します。リサーチして使用し、オブジェクトの作成中にオブジェクトを使用できるようにします (オンザフライで作成されます)。arena はサードパーティのライブラリarena::{Arena, TypedArena}リンク
  15. 仮想メモリ、ページ、ワード、ページ フォールト、スワッピング、仮想メモリ、実メモリ、ページ テーブル、セグメント、セグメンテーション フォールト、MMU、TLB (変換ルックアサイド バッファ) の一般的な用語。詳細については、203 ページを参照してください。
  16. 6.4.2節では不正な領域にアクセスした際に発生するセグメンテーションフォールト(セグメンテーションフォールト)について説明しており、実装については以下のコードを参照してください。
  17. セクション 6.4.3 では、MMU (メモリ ダメージ ユニット) の役割、つまり仮想アドレスから物理アドレスへの変換と、TLB キャッシュを使用して高速化する役割について説明し、ページ 206 では、アドレス変換のプロセスでオペレーティング システムと CPU によって使用されるいくつかの小さなトリックについて説明します。
  18. 以下の図は、実行可能ファイル (ELF) が仮想メモリにロードされて実行される様子を示しています。ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Mint2yx4/article/details/131188752