データの塊

"魂(たましい)"じゃないですよ。カタマリ(^^;;)。ここでいうデータは、狭い意味でのデータです。コードにはあまり関係ありません。

データの最小単位はバイト、基本単位はセル(ワードともいいますが、混乱しないようセルで通します)。ですが、もっと大きなデータを"ひとつの"データとしてまとめて扱いたい場合があります。このための方法はいくつかあります。とりあえず、基本的なものを二つ説明します。アレイ(Array)と構造体です。

構造体

まず構造体。これはレコード(record)とも呼ばれます。多分レコードの方が古い言い方でしょう。Pascalではそのように呼びます。C言語などでは構造体(structure)と呼びますね。このタイプは、色々なタイプの値(バイト長も区々)を一挙にまとめて扱うものです。

構造体を構成する一つ一つの値を構成員(メンバー)とかいいます。これらはそれぞれ大きさがまちまちであるのが普通です。頭からきっちり詰めれば一番メモリー効率は良くなりますが、値を取り出したり格納したりする際には、機械毎に効率の良い方法があります。つまり、実行効率としては、きっちり詰めるのが必ずしも最良ではないのです。そこで、機械毎に適当な詰め物をして効率よく配置する方法が定められ、推奨されています。構造体に関する効率的配置方法は構造体アラインメントと呼ばれます。

PowerPCで推奨されているアラインメントは次のようなものです。基本的には頭から詰めて行きます。ただし、1バイト幅のメンバは1の倍数、2バイト幅のメンバは2の倍数、4バイト幅のメンバは4の倍数のアドレスからしか始められません。~の倍数というのは、メモリーアドレスの値のことで、単位はもちろんバイトです。1バイト幅は1の倍数というのは、要するにどこからでも始められるということです。順番によっては隙間が空きますので、余った半端な部分は空けておきます。半端な部分の値には意味はありませんが、0を詰めておくのが良いようです。

ところが、MacintoshのCarbonでは68kプロセッサという古いプロセッサを使っていたMacintoshとの互換性が維持されていることから、Carbonシステムコールでは68k用アラインメントが採用されているそうです。これは、2バイトより長いメンバーは2の倍数のアドレスを頭にしないといけないという配置です。

システムコール関係でこういった配置が必要になときには、Mopsが面倒を見てくれるので、あまり気に病むことはありません。このような事実があるということが意識できれば充分でしょう。

下の図は、それぞれのアラインメントで、順に、1バイト、2バイト、2バイト、4バイト、1バイト、の長さのデータを格納した場合の配置です。
構造体 ... PowerPC alignment
1バイト      2バイト    
2バイト    
4バイト
2バイト  
構造体 -- 68k alignment
1バイト      2バイト    
2バイト 4バ
イト 2バイト

68kも4バイトセル(色々あるらしい)としてわけ書きしてみました。本当のメモリーはひとつながりです(論理的には)。文字表示のない区画(一応、青っぽくしてある)が詰め物(padding)です。

このように、構造体は、色々な大きさのメンバーでできており、機械に依存する間隔の詰め物がされている場合もあるので、各メンバーにアクセスするには、その名前(タグというようです)を用います。これこれの構造体のこれこれという名前のメンバーの値という形で特定するわけです。

アレイ

もう一つはアレイ(Array)です。アレイもまた、複数の構成員を持ちますが、各構成員は同じバイト幅をもつのが特徴です。各構成員は、1バイト2バイトといった小さいものも、構造体のような1セルを越えるものもあります。各構成員の大きさが同じである結果、その頭は均等な間隔で並ぶわけです。

この均等配列という特徴のおかげで、各構成員へのアクセスは単純になります。最初の構成員からのズレを用いて、任意の構成員に到達できるからです。最初の構成員を0番要素とすると、i番要素の頭は、
0番要素の頭のアドレス + (i × メンバーのバイト幅)
で決まります。ですから構成員は名前を要せず、第何番要素ということで特定できるわけです。もっとも、各構成員が構造体であるときには、その構成員の内部的なメンバーには、名前でアクセスすることになりますが。

アレイポインタ
      ↘︎
   ↓ 第0要素
   ↓ 第1要素
i×アイテム幅   :
   ↓   :
   ↓   :
第i要素ポインタ↗︎ 第i要素
  :
第n要素

以上が、データを塊として扱うときの、二つの基本的な方法です。


< 前へ   次へ >
目次へ



最終更新:2019年07月12日 20:19