08 マシンレベルプログラミングIVデータ

配列の割り当てとアクセス

C の配列は、スカラー データをより大きなデータ型にグループ化する方法です。C で配列を実装する方法は非常に単純なので、マシンコードに変換するのは簡単です。C 言語の珍しい機能は、配列要素へのポインターを生成し、これらのポインターに対して演算を実行できることです。マシンコードでは、これらのポインターはアドレス計算に変換されます。
最適化コンパイラは、配列のインデックス付けに使用されるアドレス計算を簡素化するのに非常に優れています。ただし、これにより、C コードとそのマシンコードへの変換との対応関係がややわかりにくくなります。

8.1 基本原則

C 言語では、ポインターで算術演算を実行でき、計算された値は、ポインターによって参照されるデータ型のサイズに応じてスケーリングされます。

  • ポインタ型が T の場合、P は次の配列を指します: p + i = xp + L * i (L は要素のサイズ)。
  • 歴史的に、C 言語はコンパイル時にサイズが決定される多次元配列のみをサポートしていました。プログラマが可変長配列を必要とする場合は、malloc または calloc が必要になります。

8.2 異種データ構造

C 言語には、異なる型のオブジェクトを組み合わせてデータ型を作成するための 2 つのメカニズムが用意されています。

  • 構造体は struct を使用して宣言されます。複数のオブジェクトを 1 つのユニットに収集できます。

8.2.1 構造

  • 配列と同様に、異なるタイプのオブジェクトが連続したメモリ領域に集められます。
  • 構造のすべてのコンポーネントはメモリ内の連続した領域に格納されます。
  • 構造体へのポインタは、構造体の最初のバイトのアドレスです。
struct rec{
  int i;
  int j;
  int a[2];
  int *p;
}

ここに画像の説明を挿入します

8.2.2 データのアライメント

  • 特定の種類のオブジェクトのアドレスは、特定の値 K の倍数である必要があります。
  • プロセッサがメモリから 8 バイトをフェッチする必要がある場合、アドレスは 8 の倍数である必要があります。
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_56898461/article/details/129718667