メモリアライメント(転載)

C / C ++でのメモリアライメントの問題のいくつかを理解し、zhihuで再現

メモリ管理はC / Cの共通のデータ構造とデータ型の一部のメモリ分布++、それは主に符号化処理のメモリリークやクロスボーダーおよび他のより深刻なメモリの問題を軽減することができます精通したコンテンツの非常に重要な部分を、プログラミングC / C ++でメモリアライメントの問題、主に以下の構造を議論する(種類に言及するとき、メモリに整列クラス、メモリアライメントが多少複雑になる、などの問題同じ仮想テーブルに関連し、後述します)。

侵害、してください連絡先を削除した場合、間違った場合、私を修正するために歓迎ありがとう

命令メモリアライメント

  1. 一般的に、メモリのアライメントにより符号化処理が透明であり、制御にコンパイラによって行われます
  2. クリアメモリアライメント要件、利用可能なnで指定の#pragmaパック(N)、およびデータ構造有意な値の小さい方部材の最長
  3. 明示的なデータ構造では、ときにメモリの整合部材の最長の長さを指定しない場合RMS

以下のような特別な命令は、ケース3(指定されていない)を計算するとみなされません

3つのルールのメモリアライメント

  1. メンバーまたはメンバーサイズから格納されたデータの各後のデータメンバデータ整列ルール部材、構造(構造体)(または組み合わせて(連合))、ゼロオフセットに格納されたデータの最初のメンバー開始位置にサブメンバーのメンバー(ただし、そのような配列、構造、等のサブメンバーのメンバー)の整数倍数開始のサイズ(例:4バイトは、ストレージの開始から整数倍アドレス4 64ビットのターゲットプラットフォームで占有INT)
  2. 複数のアドレスは、いくつかの構造部材が存在する構造であれば、構造体のメンバは、最大要素サイズの内側から、部材としてのメモリ構造を開始する整数
  3. 構造体の合計サイズ、すなわち、はsizeof結果、メンバーが最大長の内部でなければならない(すなわち、フロントアライメント命令の実効値がメモリに言及)が不十分にパディング整数倍であります

ノートには、2つの他のポイントがあります。

  1. アレイは、個々の要素を整列させた場合、各配列要素の記憶された別々に、CHAR型はメモリ整列に従って、1バイトである場合、メモリに記憶されています
  2. 組合(ユニオン)は、共有メモリデータを入力し、一般的に共通のメモリの関節部、同一のメモリアドレスの開始位置、メモリ幅、メモリサイズなど組合の最大のメンバーのすべてのメンバーは、主な理由は、保存することですメモリ空間、デフォルトのアクセスはpublicですが、それはまた、メモリアライメントの原則を遵守する必要があり、具体的には、ルール3
  3. C ++中空構造は、1バイトを占めています
  4. C ++クラスはまた、セクションで説明した中空の1バイトのメモリ空間(によって占有されているこのタイプの宣言インスタンスがメモリ内の一定のスペースを占有しなければならない、あるいは、どのくらいのメモリフットプリントこれらの例を使用することはできません提供2.2.1を、勝利コンパイラによって決定)

私たちは、栗、以下の指示を与えるようになりました

栗1

struct Test1 {
    int a;
    double b;
    char c;
};

説明:

  1. int型、4バイトは、(メモリ位置0-3)ルールを占領1
  2. ダブルB;ルール、8バイト(長さ(即ち、8バイト)から型記憶場所又は8-15を格納する整数倍数開始)を占有1
  3. チャーC; 1バイト(記憶位置16)、ルールを占有1
  4. このとき17バイトのシェアが、ルール3を使用して得られたのsizeof 24の大きさ、で、最終のsizeofのサイズはまた、メンバーの最大内部長さの整数倍である必要があり、充填される、この構造体は不十分です最大部材は、ダブルBである8バイト、24の最終的な大きさ、ルールsizeofは3

栗2

struct Test2 {
    int a;
    double b;
    char c[6];
};

説明:

  1. int型、4バイトは、(メモリ位置0-3)ルールを占領1
  2. ダブルB;ルール、8バイト(長さ(即ち、8バイト)から型記憶場所又は8-15を格納する整数倍数開始)を占有1
  3. メモリ整列個々の要素のために、各配列要素のチャータイプは1バイトであり、別々に格納されている場合、アレイは、メモリに格納されているサイズはsizeofまたは24、ノートルールそう1&3

栗3

struct Test {
    int a;
    double b;
    char c;
};

struct Test3 {
    int a;
    Test d;
    double b;
    char c;
};

説明:

  1. int型、4バイトは、(メモリ位置0-3)ルールを占領1
  2. テスト最大の要素は、ダブルBであり、8バイトを占有する、試験部材に8バイト格納された開始アドレスの整数倍であり、試験のint; 4バイトは、(メモリ位置8-11)、ダブルBを占領、8バイト(記憶領域を占有位置16-23)、チャーCは、1バイト(記憶位置24)、ルール2を占領しました
  3. ダブルB;占有8バイト(格納位置32-39)、ルール1
  4. チャーC;占有1バイト(記憶位置40)、最大の要素サイズが8の整数倍ではなく、ルール3、はsizeof 48に従って充填され、ルールは、ルール1と3 2&ルール

栗4

struct Test {
    int a;
    double b;
    char c;
};

struct Test3 {
    int a;
    Test d;
    char c;
};

説明:

  1. データメンバTest3はの最大サイズが最大内部部材テスト部材構造のサイズよりも小さい場合、ルール3に係る全体の内部構造部材の最大のメンバーである結果が40のsizeofであり、倍数を充填

栗5

union Test{
    char a[20];
    int b;
    float c;
};

説明:

  1. SIZEOFサイズ、すなわち、A [20]のサイズは、B、Cの同じ倍数が20であり、ルール、20 3

栗6

union Test{
    char a[20];
    int b;
    float c;
    double d;
};

説明:

  1. SIZEOFサイズ、すなわちA [20]を収容する満たすために、それはルール、同一の20 B、CおよびDの倍数であり、24であり、3

バイト整列の理由:

  1. プラットフォームの理由(移植の理由)、いないすべてのハードウェアプラットフォームは、任意のアドレスに任意のデータにアクセスすることができ、いくつかのハードウェアプラットフォームは、特定のアドレスのデータの唯一の特定の種類を取るハードウェアまたは例外を投げることができます
  2. パフォーマンス上の理由から、メモリアライメントの後、CPUのアクセス効率が大幅に改善される(ブロックサイズのピースとしてCPUメモリが2,4,8,16Byteサイズであってもよいし、CPUとメモリが読み取られますデータは、前二回6、それはアクセスするCPUへのアクセスを必要とする|読み取りブロックのサイズは4バイト、データのシェアが3の(オフセット)バイトオフセットされている場合、の作品を読ん| 4 | 5完全なデータを取得し、メモリアライメントの後、あなたは、データを介してCPUへのフルアクセスを得ることができます[から引用]

より多くのテストはwin10 vs2017 64ビットコンパイラの下で実施されています

おすすめ

転載: www.cnblogs.com/yxl-2018/p/12403887.html