構造体の配列: Sample 1: 構造体のメンバーのコピー(FORTRAN)
言語の変更:
C版
■ 概要
ここでは構造体のあるメンバーの配列を別の配列にコピーするサンプルを示します。
Code 1は配列の構造体のサンプルです。配列a, b, c, d, e, f, g, hをメンバーとするVectorという構造体を定義します。Vector型のvecを宣言してからそれぞれのメンバーの配列を長さnでメモリの確保をします。メイン計算ではメンバーの配列aを別の配列rにコピーをします。
Code 2は構造体の配列のサンプルです。a, b, c, d, e, f, g, hをメンバーとするVectorという構造体を定義します。Vector型の配列vecを長さnでメモリの確保をします。Code 1と同様にメイン計算ではメンバーの配列aを別の配列rにコピーをします。
配列の長さnとして2,000,000から40,000,000まで20個の値を用いて、Code 1とCode 2のメイン計算にかかる時間を測定して出力します。
■ ソースコード
◆ Code 1 | ◆ Code 2 |
■ 計算時間の測定結果
Code 1とCode 2を実行したときの計算時間をそれぞれ青線と赤線で図1に示します。そして両者の比を緑線で示します。
.png)
図1 測定時間
■ 考察
Code 1の配列の構造体では配列のメンバーが連続的に配置されているので、構造体のメンバー、配列aにアクセスするときはメモリのジャンプは起こりません(図2を参照)。一方、Code 2の構造体の配列では構造体の同じメンバーは不連続に配列されているので、このサンプルでは図3のようにメモリのジャンプが起こります。

図2 Code 1のときのメモリアクセス

図3 Code 2のときのメモリアクセス
図1の実測ではCode 1がCode 2より計算時間が2~3倍速いです。2次元配列のときよりは倍率が低いですが、構造体のメンバーの個数(サイズ)によっては倍率がもっと上がる可能性があります。