C言語の難点のメモリの配置とビットの位置


一:構造体メモリの配置
(1)なぜメモリの配置が必要ですか?
プラットフォームの原因(移植の原因):すべてのハードウェアプラットフォームが任意のアドレス上の任意のデータにアクセスできるわけではない。いくつかのプラットフォームは特定のタイプのデータを特定のアドレスでしか取得できません。そうでないとハードウェアの異常を投げ出します。
例えば、1つのプラットフォームが1つの整体データを取る場合、アドレスが4の倍数の位置でしか取得できない場合、メモリの配置が必要です。そうでないと、この整体データにアクセスできません。
性能原因:
データ構造(特にスタック)は可能な限り自然境界上に整列すべきである。原因は、整列されていないメモリにアクセスするために、プロセッサはメモリアクセスを2回行う必要があるからです。配置されたメモリへのアクセスは一回だけです。
核心思想とは:空間を時間と引き換えに
 例えば、32本のアドレスバスがあるコンピュータでは、毎回読み込む単位は4バイトであり、偽エントリは次のような構造体を定義している。

struct s1
{
char c1;
int i;
char c2;
}
c 1は1バイト、iは4バイト、c 2は1バイトですので、コンピュータは読みの際に、c 1とiの3バイト(合計4バイト)を先に読み、iの最後のバイトとc 2を読みます。そのため、計算機は2回のメモリ読み取りを行うだけでなく、iのデータをつなぎ合わせてもいいので、運転時間が無駄になります。時間の無駄を減らすために、メモリを揃える方式を採用しました。
(2)構造体の配置規則
  • 最初のメンバは、構造体変数とのオフセット量が0のアドレスにある(すなわち、構造体の最初のアドレス、すなわち0に配置される)
  • 他のメンバー変数は、ある数字の整数倍のアドレスに配置されます。
  • 構造体の総サイズは最大配置数(各メンバ変数に1つの配置数)の整数倍である。
  • 構造体がネストされていると、ネストされた構造体が自分の最大の配置数の整数倍に揃えられ、構造体の全体サイズはすべての最大配置数(ネスト構造体の配置数を含む)の整数倍となります。
  • 配置数=コンパイラのデフォルトの1つの配置数とそのメンバーのサイズの小さい値があります。vsではデフォルトは8です。Linuxのデフォルト値は4です。
    (3)構造体の整列デモ
    下の構成体を例にとって
    
    struct S
    {
    	double d;
    	char c;
    	int i;
    };
    
    
    第一ステップ:構造体の各メンバー変数のサイズをコンパイラのデフォルトの配置数と比較し、そのメンバーの配置数として小さいものを取る。
    在这里插入图片描述
    第二ステップ:0位から、これらのメンバーの位置を描き、自分の配置数に合わせるようにします。
    在这里插入图片描述
    16バイトです
    (4)練習
    
    //  1
    struct S1{
    	char c1;
    	int i;
    	char c2;
    };
    printf("%d
    ", printf(struct S1);//12 // 2 struct S2 { char c1; char c2; int i; }; printf("%d
    ", sizeof(struct S2));//8 // 3 struct S3 { double d; char c; int i; }; printf("%d
    ", sizeof(struct S3));//16 // 4- struct S4 { char c1; struct S3 s3; double d; }; printf("%d
    ", sizeof(struct S4));//32
    二:段
    (1)段とは何ですか?
    「省スペース」という四つの文字は、単刀直入に点呼することができます。
    構造体の設計では、私達は普通intで年齢というデータを保存しますが、年齢というものはいくら大きくても何百何千元にも達しません。つまり、その範囲は普通1-100です。整形データのメモリに反応して、32ビットの中のいくつかを使ってもいいです。つまり、残りのビットはまったく使えません。これを知っているなら、とりあえずとりあえずとりあえずとりあえず整形、4バイト、32ビットの記憶という小さな数を投げます。ちょっともったいないです。だから正式にこのために、段は合理的にメモリの設計を行うことができます。
    (2)段はどう書きますか?
    ビットの基本的なフォーマットは以下の通りで、構造体と非常に似ています。その内部のデータの種類は一般的に同じです。
    在这里插入图片描述
    (3)ビット構造体の配置はどうやって計算しますか?
    上述のこの構造体の占める空間サイズは8バイトで、実際に割り当てられると、まず4バイトが割り当てられます。ここでa、b、cは2+5+10の合計17ビットを占めています。残りのdは30ビットの記憶が必要ですが、足りないので、さらに4バイトを割り当てて、30ビットの記憶を取り出します。暴力以前の16バイトに比べて、現在の8バイトは大幅に節約されているとみられます。
    次の段のように
    
    struct A
    {
    	unsigned a : 19;
    	unsigned b : 11;
    	unsigned c : 4;
    	unsigned d : 29;	
    	char index;
    };
    
    ここで、aとbは4バイトを占めています。cとdは8バイトを占めています。indexは1バイトを揃えています。最終的には16バイトです。
     段のクロスプラットフォーム問題
  • intビットは、符号があるか、符号がないかは不確定です。
  • ビットの中で最も大きなビットの数は確定できません。16人のマシンは最大16、32人のマシンは最大32、27と書き、16人のマシンで
  • です。
  • 器が故障します。
  • ビットのセグメントのメンバーはメモリ内で左から右に割り当てるか、右から左に標準を割り当てるかはまだ定義されていません。
  • は、1つの構造が2つのビットを含み、2番目のビットが大きいので、1番目のビットの残りのビットに収容できない場合、残りのビットを捨てるか、それとも利用するかは不明です。
  • ここでC言語の難しいところについての文章を紹介します。C言語のメモリの配置とビットの内容については、以前の文章を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。