構造体のメモリ位置合わせ&コモンのサイズ端の問題

4048 ワード

以下の例では、バイト数の最大データ型はint、4バイトである.この構成体がメモリを割り当てる場合、分割する総バイト数は4の倍数でなければならない.
私は部屋を開く例で説明して、a,b,cに参加して一人一人が宿泊する時の部屋の面積に対する最小の要求は1平米、4平米、1平米です.もしこの空間の大きさを保証することができれば、彼らは1つの部屋を押したいのですが、部屋の大きさの規格は同じで、それはいつも需要の最大のあの人を満たすことができて、つまり1部屋あたり4平方メートルです.部屋を分けるには順番に分けなければならないことに注意してください.具体的な過程はこのように理解できます.
1、まず最初の部屋を開けて、aを住ませます.2,bは1つ目の部屋に詰められないので、2つ目の部屋を開く必要があります.3,bはちょうど2軒目の部屋がいっぱいになったので、cはもう1軒の部屋で単独で住むしかありません.**だから最終的に3つの部屋を開く必要があります.全部で12平方メートルです.なぜa,cは部屋を押しつぶさないのかと聞かれる.このように説明すると、彼らの割り当ての順序が連続していないので、一緒にいたくてもチャンスがありません.
typedef struct Node
    {
        char    a;
        int     b;
        char    c;
    }Node;
    printf("%d", sizeof(Node));  //12

メモリ割り当てのルールを知って、小さな調整をするだけで、すぐに4バイトのスペースを節約することができます.次のようにします.
typedef struct Node
    {
        char    a;
        char    c;
        int     b;
    }Node;
    printf("%d", sizeof(Node));  //8

コンピュータのメモリサイズの端の問題をもう一度話します:まず何が大きい端と小さい端なのかを説明して、私达はすべてデータがコンピュータのメモリの中で2進数の形式で記憶することを知っていて、ここで私は数値のタイプのデータで例を挙げて説明して、例えば今1つの16進数があります:int a=0 x 12345678;このような正数aに対して、その原符号の逆符号化符号化符号化は同じであり、コンピュータが記憶する際に保持するのは符号化符号化である.aにとって、その高位から低位までは対応する順序が左から右である.同時に、コンピュータの最小記憶ユニットがバイトである、1バイトが8ビットのバイナリビットを占め、各16進数が4ビットのバイナリ数に変換できることを知る、aのような1つの8ビットの16進数については、記憶時に、2つのグループが1バイトに記憶される.しかし、2つのグループのストレージにも前後の順序があります.これは私たちが議論するサイズの違いです.いわゆる大端モードとは、高位データ部分には低アドレスがあり、低位データ部分は高アドレスに格納されています.だから、大端モードのコンピュータであれば、メモリの中でaのストレージ構造を見てみると、12 23 56,78が見えます.このような記憶の方式は私たちの従来の理解に合っており、文字列のメモリにおける記憶形式に似ている.
一方、小端モードでは、正反対に、高位データ部分には高アドレスが存在し、低位データ部分には低アドレスが格納されている.この格納モードでは、78,5623,12が見られる.
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //     
x1=((char*)&x)[1]; //     
 x0=0x11,    ;  x0=0x22,    ......

共通体については、複数のデータがメモリ領域を共有することが知られている、すなわち、彼らの記憶アドレスは同じである.同じ時間にこの記憶領域には1つの要素のデータしか格納されないので、共用体の要素に値を割り当てると、実際には互いに上書きする場合が発生し、上書きされた値を読み出すとどのような結果が得られるかは、コンピュータのサイズ端モードに依存する.例:
typedef union NODE
    {
        char    a;
        short   b;
        int     c;
    }NODE;
    NODE n;
    n.a = 'a';
    n.b = 0x1261;
    n.c = 0x11111261;a
    printf("%c %x %x", n.a, n.b, n.c);  //a 1241 11111241

このような場合、3つのデータを同時に1つの記憶領域に保存することに成功したように見えますが、実際には偶然です.私のコンピュータは小端モードなので、初めてaに’a’を付与し、asciiコード97(すなわち16進数の61)をメモリ中共用体nのヘッダアドレスに格納する.コンピュータがnにメモリを割り当てると、バイト数が最も多いメンバータイプにしか割り当てられないため、nの中記憶領域は4バイト大きくなり、この記憶領域は61––次にbに値を割り当てることができ、bは2バイトを占めるため、計算機はまた小端モードである.オーバーライドが発生したメモリ領域は以下の形式にリフレッシュされます.6112–細心の友达は、オーバーライドの結果、私たちが初めて保存したデータが変更されないことを保証することができることを発見したはずです.また、cに値を付与すると、リフレッシュ後、6112 11と表示されます.したがって、私たちの3つの要素のデータは無事に共存することができます.