08. Composite Types


8.1 Records (Structures)


:異質なものを縛るのに使います.
:クラスと似ていますが、継承できません.
 element copper;
const double AN = 6.022e23; /* Avogadro’s number */ 
...
copper.name[0] = ‘C’; copper.name[1] = ‘u’;
double atoms = mass / copper.atomic_weight * AN;
  • の各フィールドにアクセスでき、異なる言語で異なる方法が使用されます.
  • Cobol: name of copper , Fortran 90: copper%name
  • 構造体内で構造体に入ることができる.
  • 8.1.2 Memory Layout and Its Impact


  • Symbolテーブルでは、コンパイラは各レコードタイプ内の各フィールドのオフセットを追跡することができる.
  • ビットの場合、メモリアクセス時間を向上させるために必要に応じてスペースを捨てることがある.
  • Value Model


  • valueモデルによれば、構造体に構造体を入れると、上の廃棄空間のように空間を再占有する.
  • struct S s1;
    struct S s2;
    s1.n.j = 0;
    s2 = s1;
    s2.n.j = 7;
    printf("%d\n", s1.n.j); /* 0 */
  • s 1はs 2から分離される.
  • Reference Model


  • 参照モデルに従うと、他の位置にあるデータを指します.
  • S s1 = new S();
    s1.n = new T(); // fields initialized to 0
    S s2 = s1;
    s2.n.j = 7;
    System.out.println(s1.n.j); // prints 7
  • referenceのみをインポートおよび使用するため、s 2を変更してもs 1(別名)
  • を変更する.

    Packed


    :速度が遅くなっても、最小限のスペースを消費します.

    Copies and Comparisons

  • レコードをコピーしたり、比較したりすることができます.
  • in-line copy
    :
  • 、構造体のフィールドに1つずつコピー
  • library routine
    :長い場合は、ライブラリを使用してblockcapieを提供します.memcpy()
  • block_compare
    :memcmp()によって比較が提供されます.
    不要な値を入力->失敗の可能性を増やす->予測可能な値またはコンパイラ比較のインスタンスを作成できます.

  • Holeのためにメモリが浪費され、複雑になります.
  • recordフィールドの順序を変更します.(バイト順)
  • ですが、システムプログラムに問題が発生する可能性があります.
  • に従って、順序を変更せずに、最初の領域を再開します.

  • 言語によっては、プログラマが何バイトを占めるかを決定する言語が存在する.(Ada, C, C++)
  • 8.1.3 Variant Records (Unions)

    union { 
    	int i;
    	double d;
    	_Bool b; 
     };
  • を同時に使用しないという仮定の下で、フィールドの最大バイトのメモリを割り当て、メモリを共有します.
  • システムプログラムは、異なる方法で同じデータを使用する.
  • ex)doubleを入れ、charch[8]で抽出します.
  • 構造体では、異なる時期に使用されるブロックフィールドが存在する可能性がある.
  • ex)要求(給与、時間または問い合わせ)に従ってその他の内容(氏名、住所、電話、部門、ID番号)を選択する際に
  • を用いる.

    8.2 Arrays


    :均一な要素で構成されます.
  • 離散型をインデックスとします.
  • 非離散インデックスタイプも許可されます.
  • ハッシュテーブル、検索ツリーからなる.
  • Ada
    mat1 : array (1..10, 1..10) of long_float;
    mat2 : matrix(1..10);
  • mat 1:2 Dアレイ、mat 2:1 Dアレイ
  • Cdouble mat[10][10];:mat[2]の場合は、参照を表します.

    8.2.3 Memory Layout


    :最初の要素の次の要素は右に表示されますか?(row major)、下へ行きますか?(column-major)

    Row-Pointer Layout

  • rowはメモリ内の任意の場所に存在し、各rowには配列があります.
  • の大部分は空間を占有しているが、優位性がある.
    これは
  • メモリ計算ではないので、簡単に素早くアクセスできます.
  • の異なる長さの行を持つことができます.
  • は、既存のrowを再利用することができる.
  • C、C++:文字列配列は例外的に許可されます.

  • Java:objectタイプのすべての配列でrow-pointレイアウトを使用します.
  • 8.3 Strings


    :“”,“”
  • C/C+:文字と文字の文字列を区別します.
  • Pascal:Characterは長さ1のString
  • です.
  • C++/Java:Stringは可変長を許可します.
  • 可変長文字列の動作は、多くのコンピュータアプリケーションの基本機能である.
  • 次元で、1バイトの要素を持ち、他の参照を含まず、容易に実現できます.
  • C言語はCharacterの集合をStringと見なす.