メモリの位置合わせに関するいくつかの記憶

2053 ワード

メモリ位置合わせの4つのルール:
  • の最初のメンバーは、構造体変数からのオフセットが0の位置にある.
  • 他のメンバー変数は、ある数(その数)の整数倍のアドレスに整列します.その数=コンパイラのデフォルトの位置合わせ数とメンバーのサイズの小さい方.

  • vsのデフォルト値は8 Linuxのデフォルト値は4です
  • 構造体の合計サイズは、その数(メンバー変数ごとに1対の数)の最大整数倍です.
  • ネストされた構造体が自分の最大対数の整数倍に整列している場合、構造体の全体的な大きさは、ネストされた構造体の整列数を含む最大整列数の整数倍である.

  • 注意:第2条では、そのメンバーであり、現在のメンバーであり、他のメンバーではありません.
    もう1つの言い方(4つのルールの意味と同じ):
  • 構造の各メンバーについて、最初のメンバーはオフセット0の位置にあり、以降の各データメンバーのオフセット量はmin(#pragma pack()で指定された数、このデータメンバー自身の長さ)の倍数でなければならない.
  • データメンバーがそれぞれの位置合わせを完了した後、構造(または結合)自体も位置合わせされ、位置合わせは#pragma packで指定された数値と構造(または結合)の最大データメンバー長のうち、比較的小さいもので行われる.

  • 注:#pragma packの使用法は#pragma pack(n)で、nは1 2 3などの値を取ることができて、nバイトの位置合わせに設定することを表します
    列挙説明:
    struct st1 
    {
    	char a ;
        int  b ;
       	short c ;
    };
    

    St 1:charは1バイトを占め、開始オフセットは0intは4バイトを占め、#pragma pack()はこのデータメンバーの自身の長さより前の小さい値4(VC 6のデフォルト8バイトの位置合わせ)と指定するので、intは4バイトの位置合わせで、開始オフセットは4の倍数でなければならないので、開始オフセットは4で、char後にコンパイラは3バイトの追加バイトを追加します.任意のデータは保存されません.shortは2バイトを占め、2バイトで整列し、開始オフセットは8で、8はちょうど2の倍数であり、追加バイトを追加する必要はありません.これで、最初の位置合わせが完了します.メモリのステータスは次のとおりです.
    					oxxx|oooo|oo
    

    この時点で合計10バイトを占めます.また、構造自体の位置合わせ、すなわち2回目の位置合わせを継続し、位置合わせは#pragma packで指定された数値と構造(または連合)の最大データメンバー長のうち、小さい数で位置合わせされ、st 1構造の最大データメンバー長はintで4バイトを占め、デフォルトの#pragma packで指定された値は8であるため、結果として2つの小数をとると4バイトで位置合わせされ、構造の合計サイズは4の倍数でなければなりません.2つの追加バイトを追加して、構造の合計サイズを12にします.メモリの状態は次のとおりです.
    		oxxx|oooo|ooxx
    

    このメモリの位置合わせは終了します.St 1は7バイトではなく12バイトを占有している.