2016-04-26 15 views
1

倍精度浮動小数点数の配列で計算を非常に高速に(ほとんどの場合、マルチスレッドで)実行できる外部ライブラリがあるとします。便宜上、私はオブジェクト指向の方法で私のコードを書くので、私はオブジェクトの配列を取得します。各オブジェクトには、double値を保持するプロパティがあります。パフォーマンスライブラリ用の効率的なラッパーを作成するための効率的な方法

double temp[N]; 
for i from 1 to N 
    temp[i] = objectArray[i].property; 
end 

しかし、これは一時配列を保持するために、時間と追加メモリをとります。強力な外部ライブラリを利用するために単純なアプローチは、このようなものです。それを行う良い方法はありますか?

これは一般的な質問ですが、基本的にC++でこれが欲しいです。

+1

ライブラリが配列に対してアルゴリズムを実行し、配列のみを使用する場合は、これは単なる方法です。あなたのライブラリが別の方法でそれを実行できる場合は、このライブラリについてもう少し知る必要があります。 – Unda

+0

私は考えることができるいくつかのオプションがあります:1.あなたのobjectArrayの隣にdouble []メンバーを保持し、常にそれらが同期していることを確認します。 2.より良い選択肢は、ダブルプロパティをdouble []を指すdouble *で置き換えることです。同期コード –

+0

を書くことはできません。ライブラリー 'API'を知り、提案を思いつくのは難しいです。このため、 'STL'スタイルのインターフェースは、イテレータ*としてポインタの概念を一般化するという点で非常に強力です。あなたのライブラリがイテレータ*を受け入れるなら、これははるかに簡単です。 APIのようなものはありますか? – Galik

答えて

2

あなたのオブジェクトのみdoubleデータメンバー、ノーデータ・メンバーの追加の塩基及び無virtual機能が含まれていることを確認している場合は - と外部ライブラリ関数を想定したアウトオブラインである - sizeof(*objectArray) == sizeof(double)があること、静的な主張に確認してください外部ライブラリa double*objectArray[0]に渡すことができます。

ライブラリ関数がインクルードするヘッダ内にインラインである場合、エイリアスの問題が発生する可能性があり、オプションについてはコンパイラのドキュメントを参照する必要があります。あなたのobjectArray要素がないを行う場合

はちょうどそれが外部ライブラリを期待するものだ場合は、は圧縮され、配列にコピーする必要があります、doubleそれぞれ開催します。 (1つの選択肢として、doubleの値を配列に保持し、より複雑なオブジェクトに配列要素への参照を格納させることが考えられます)。

+0

私の 'objectArray'には、他の基本データ型と、他のクラスのオブジェクトも含まれています。圧縮された配列はどういう意味ですか?だから、そのダブル配列をクラスのプロパティに格納することをお勧めしますか? –

+0

@ZoltánCsáti:by "compacted array"配列のメモリ内で連続的な要素を強調したところです。ライブラリをそれに適用できるように配列を作成しているだけで、その要素を 'objectArray'要素に戻すと、*"そのクラスのプロパティにdouble配列を格納している* "には明らかな値はありません。配列をオブジェクトとして扱い、その上で操作を呼び出そうとしている場合は、配列を格納または管理するクラスを作成しなければならない場合があります。申し訳ありませんが、これが助けにならない場合は、最良の選択肢を決定するニーズのバランスです。 –

+0

"ライブラリを適用できるように配列を作成している場合のみ"はい、それは私が必要なものです。だから私はそれをよく理解すれば、あなたは と言っている1)そのダブル配列をプロパティに格納しないでください - それは使用しません、 2)私はその配列に操作をしたくないので(単にそれを渡す必要があります私の質問に見られる私の素朴なアプローチを使用してください。 –

1

あなたのオブジェクトにアリーナ戦略を使用できます。基本的に私たちのオブジェクトには、データアリーナのインデックスとハンドルだけが含まれます。実際のデータは、正しいインデックスのアリーナに格納されます。この方法で、ダブルのベクトルを作成する必要があるときは、すでにアリーナ内に存在します。

これは、どのオブジェクトが一緒に処理されているかを常に知っていて、ほとんど常に一緒に処理される場合にのみ機能します。必要なオブジェクトを毎回選択する必要がある場合は、オブジェクトが配列内で常に連続していない限り、パフォーマンスの向上は望めません。これにより、通常のオブジェクトへのアクセスが少し遅くなります。そのため、毎回値をコピーすることが実際にプログラムのボトルネックになっている場合にのみ意味があります。

あなたのデータ構造は次のようになります。

class Arena { 
    vector<double> propertyX; 
    vector<double> propertyY; 
    int next_index; 
}; 

class MyObject { 
    int index; 
    Arena& arena 
    MyObject(Arena& arena_ref): arena(arena_ref) { index = arena.next_index++; } 
    double getX() { return arena.propertyX[index]; } 
}; 

あなたは必ず物事が割り当てられ、そのようなさにするために、もう少しコードが必要ですが、あなたのアイデアを得ます。外部ライブラリを呼び出す必要があるときは、Arenaオブジェクトから直接配列を取得します。

関連する問題