2013-08-12 13 views
5

それぞれが同じサイズの配列のリストが必要であると仮定します。 、異なるサイズの配列のために、我々は選択肢を持っていないもちろん2次元配列とFortran 90の派生型の配列の比較

type test 
    integer, allocatable :: content(:) 
end type 
type(test), allocatable :: data(:) 

integer, allocatable :: data(:,:) 

または派生型の配列:それは、より良い性能面2D配列を使用することです。しかし、2つのケースの間でどのようにメモリを管理していますか?また、その1つは良いコードプラクティスですか?

答えて

4

通常、問題に適した最も単純なデータ構造を使用します。 2次元の長方形の配列があなたのニーズを満たしていれば、膨大な数の科学計算上の問題、Fortranが良い選択であるという問題のために、それはあなたが望む選択です。

2d配列はメモリ内で連続しているため、通常、キャッシュと間接レベルの両方により高速にアクセスできます。 2次元配列はdata = data * 2またはdata = 0.のような配列を使ったアプローチではない配列を持つこともできます[追加編集:IanHがコメントで指摘しているように、定義された型を作成し、それらの型に対して操作を定義できますこれを可能にする]。これらの利点は、 "不揃いの配列"がある場合でも、予想される行の長さの範囲がそれほど大きくない場合でも、長方形の2次元配列として実装することは、時には考慮すべき選択肢です。

+2

配列への乗算と割り当てに関するコメントに関して定義された操作によって提供される機能を考慮してください。 – IanH

+0

十分にはっきりしていますが、組み込み2D配列を使用すると、(a)より速く(b)、おそらくより少ない一時的な時間(例えばd = a * b + c)同じ時間、すべて無料で(d)。場合によっては配列の配列を行うのがより理にかなっていますが、余分な一般性を必要としない場合は、単純な場合を使用するのがおそらく理にかなっています。 –

9

あなたの心はあなたのコードにとあなたの頭の中で解決策を問題間を跳躍するために持っている概念的な距離を最小限に抑え、実装を選択してください。このアプローチの力は、コードの年齢(良い概念設計は将来の開発のための強固な基盤)とあなた自身の年齢の両方で年齢とともに増加します(コードを理解する努力が少なくても、それ)。

メモリが管理される方法に関するあなたの質問の意見ではない部分について...私の素朴な期待は、大部分の状況下ではほとんどのコンパイラがアウトラインの最初の部分に連続したメモリを割り当て、 2回目ではないかもしれません。しかし、私はチェックするためにこれについて十分に気にしない、と私はあなたがどちらかをする必要はないと思う。私は、これにより、ボンネットの中で何が起こっているのかに興味を持ってはならないことを示唆するのではなく、最初の段落で言及された事項にもっと関心を持っていなければならないということです。

+1

+1 - これについてもっと考えてみると、「概念的な距離を最小にする」ことは、おそらく「最も単純な」という抽象的な尺度よりも重要です。 –

+0

それはまさにそれです!あなたは読みやすさとパフォーマンスのバランスを見つけなければなりません... – Girardi