C言語基礎(ビットドメイン)

2585 ワード

プログラムの構成に複数のスイッチング量が含まれている場合、TRUE/FALSE変数のみ、以下のようになります.
struct
{
  unsigned int widthValidated;
  unsigned int heightValidated;
} status;

この構造には8バイトのメモリ領域が必要ですが、実際には変数ごとに0または1しか格納されません.この場合、C言語はメモリ領域をよりよく利用する方法を提供します.構造内でこのような変数を使用する場合は、変数の幅を定義してコンパイラに伝えることができます.これらのバイトのみを使用します.たとえば、上記の構造は次のように書き換えることができます.
struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status;

これで、上記の構造ではstatus変数が4バイトのメモリ領域を占有しますが、値を格納するのに2ビットしか使用されません.32個の変数を使用し、各変数の幅が1ビットの場合、status構造では4バイトが使用されますが、もう1つの変数を使用し、33個の変数を使用すると、メモリの次のセグメントに33番目の変数が格納され、このとき8バイトが使用されます.この概念を理解するには、次の例を見てみましょう.
#include 
#include 
 
/*   */
struct
{
  unsigned int widthValidated;
  unsigned int heightValidated;
} status1;
 
/*   */
struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status2;
 
int main( )
{
   printf( "Memory size occupied by status1 : %d
", sizeof(status1)); printf( "Memory size occupied by status2 : %d
", sizeof(status2)); return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

ビットドメイン宣言


構造内でビットドメインを宣言する形式は次のとおりです.
struct
{
  type [member_name] : width ;
};

 
構造体メモリ割り当ての原則
原則1:構造体の要素は定義された順序でメモリに格納されますが、緊密に配置されているわけではありません.構造体が格納するヘッダアドレスから、各要素がメモリに格納されると、メモリは自分の幅で空間を区切っていると考えられるため、要素が格納される位置は必ず自分の大きさの整数倍で始まる.
原則2:原則1に基づいて、計算されたメモリセルがすべての要素の中で最も広い要素の長さの整数倍であるかどうかを確認します.もしそうなら、終わります.そうでなければ、整数倍に揃えます.
テストの例:
#include 

typedef struct t1{
    char x;
    int y;
    double z;
}T1;

typedef struct t2{
    char x;
    double z;
    int y;
}T2;

int main(int argc, char* argv[])
{
    printf("sizeof(T1) = %lu
", sizeof(T1)); printf("sizeof(T2) = %lu
", sizeof(T2)); return 0; }

出力:
sizeof(T1) = 16
sizeof(T2) = 24

解析
sizeof(T1.x) = sizeof(T2.x) = 1; 
sizeof(T1.y) = sizeof(T2.y) = 4; 
sizeof(T1.z) = sizeof(T2.z) = 8;

T 1:0バイト目からメモリの割り当てが開始すると、T 1.xは0バイト目、T 1に格納.yは4バイトを占める、1番目の4バイトはデータがあるのでT 1.yは4-7バイト目、T 1に格納.zは8バイトを占める、最初の8バイトはデータがあるためT 1.zは8〜15バイト格納される.合計16バイトを占めています.
T 2:0バイト目からメモリの割り当てが開始すると、T 1.xは0バイト目、T 1に格納.zは8バイトを占める、第1の8バイトはデータがあるのでT 1.zは8~15バイト目、T 1に格納.yは4バイトを占める、上位4バイトにデータがあるためT 1.zは16-19バイト格納されます.合計20バイトを占めています.この場合、バイトは最幅要素(double長8)の整数倍ではないため、8の整数倍に整列し、最終結果は24となる.