2012-01-08 19 views
2

Cには、データで1次元配列を塗りつぶす関数を用意しています。複数の1次元配列から1次元配列にデータを効率的に集める

int myFunction(myData **arr,...); 


myData *array; 
int arraySize; 
arraySize = myFunction(&arr, ...); 
私はわずかに異なるパラメータを使用して行の機能を n回呼び出したい

nは、ユーザ入力に依存している)、及びIは、その後、単一C配列に収集されたすべてのデータを必要とします。返される配列のサイズは、常に固定ではありません。ああ、myFunctionは内部的にメモリ割り当てを行います。私はこれをメモリ効率のよい方法で行いたいと思いますが、各繰り返しでreallocを使用するのはいい考えのようには聞こえません。

私は、利用可能なすべてのC++の機能を(プロジェクトがちょうどCライブラリを使用して、C++である)持っていますが、収集したデータは、後に同様の定義と関数にして送信されるためstd::vectorを使用しても良いではありません。

void otherFunction(myData *data, int numData, ...); 

私が考えることができるのはrealloc、またはstd::vectorを使用し、後でデータを配列にコピーすることです。それらはあまり有望ではありません。

+2

'vector'は、データを連続して格納し、' data() 'をC関数に渡すことができるので、問題ありません。 –

+0

私が読んだところでは、 'std :: vector :: data()'を試してみるつもりです、それは最も簡単なアプローチのようです:) – penelope

+0

@Kerrek SB 'std :: vector: :data() '関数を呼び出すと、' mydData * 'を必要とするすべての関数で完全に機能します。あなたが答えとしてあなたのコメントを書くなら、私はそれを受け入れるでしょう。 – penelope

答えて

1

すべてのデータをstd::vectorにコピーするだけです。あなたは、あなたの

効率の要件については
otherFunction(&v[0], v.size(), ...) 

または

otherFunction(v.data(), v.size(), ...) 

とベクトルvotherFunctionを呼び出すことができます。それは、あなたが途中で最適化するように私には見えます。最初にこのオプションを試してから、それがどれほど速いかを測定し、それが本当に遅すぎる場合にのみ他の解決策を探してください。

-1

あなたが必要とするいくつかの方法で自分の1D配列クラスを書くのが最善の解決策だと思います。

あなたはそのような結果を得るクラスを書く方法によって異なります。 (残念な悪い文法)..

+0

速い返信のためのthnx。残念ながら、自分の1D配列クラスを使用することはできません。私が使用する関数は既存のライブラリからのもので、 'myData * 'と' int n'(データ配列のサイズ)を組み合わせるだけで動作します。しかし、私が自分のクラスを書くとしても、クラスメソッドを扱うためには、同じ問題に対処する必要があります。 – penelope

+1

1次元配列クラスを実装する必要はありません。標準ライブラリには1つあります。 'std :: vector'と呼ばれています。 –

1

あなたが関数をN回呼び出すことを知っていて、返された配列が常にM長である場合は、まず最初に1つの配列M * Nを割り振りませんか?または、MまたはNのいずれかがわからない場合は、最悪の場合の最大値を設定します。あるいは、MとNはどちらもユーザー入力に依存していますか?

次に、ユーザー入力関数をどのように呼び出すかを変更します。渡す配列ポインタは、実際にはその大きな配列のオフセットで、正しい位置にデータを格納します。次に、次の反復、さらにオフセットして、もう一度呼び出します。各反復でrealloc()を使用して

+0

私はちょうど私の質問を編集しました.NもMも事前に知られていません。そして、私はinput-getting関数を変更することができません。これは、既存の 'C'ライブラリ(私は作者ではありません)からのものですから、 – penelope

3

は私には非常に細かいアイデアのように聞こえる、二つの理由:

  1. 「良いアイデアのような音はありません」人々は通常、彼らがパフォーマンスを確立していない時に言うことですそのソフトウェアの要件を満たしているかどうかを確認するために、ソフトウェアをパフォーマンス要件に対してテストしていません。

  2. 毎回新しいブロックを再割り当てする代わりに、reallocメソッドはメモリヒープの一番上にあると思われるメモリブロックを単純に拡張し続けるため、メモリブロックリストを横切る時間を無駄にしません、またはデータをコピーします。これは、myFunction()によって割り当てられたメモリが返される前に解放される限り、成立します。 realloc()によって返されたポインタを見て、それを確認することができます。そして、常に(またはほぼ常に(* 1))あなたが再割り当てするために与えたものとまったく同じポインタであることがわかります。

EDIT(* 1)、あなたのブロックを小さなブロックのヒープに割り当てられますので、もしいくつかのC++ランタイムは、2つのヒープ、小さな割り当て用と大型配分のための1つを実装し、それが大きくなります大きなブロックのためにヒープに一度移動される可能性があります。したがって、ポインタが常に同じであるとは思わないでください。ほとんどの時間。

+0

非常に真実ですが、' realloc'を使って実際には*悪い考えですこれはC++プログラムであるためです。 'std :: vector'を使う方がはるかに良いアイデアです。 –

+0

'realloc' *が*拡大し続けるかもしれません。あるいは毎回それをコピーするだけかもしれません。 –

+0

'realloc()'はおそらく拡大し続けるでしょう。いずれにせよ、私はreallocが何をしているかを検証する手段をpenelopeに提供しました。それで、それが拡大し続けるのでなければ、彼女はアイデアを捨てることができます。しかし、どんな場合でも、 'std :: vector'が好きで、' std :: vector'を実際に使うと良いと思います。 'std :: vector'はオプションではないと思っていたので、' realloc'の話をしました。なぜなら、 'MyFunction()'を変更する必要があったからです。 –

関連する問題