2016-11-17 3 views
-1

ベクトルにchar配列を割り当てる必要がある場合は、最初にベクトルサイズを予約してから配列を代入することをお勧めしますか?ベクトルreseveが次にパフォーマンスを向上させるために割り当て

パフォーマンスが向上しますか?

beacuseコンパイラはパフォーマンスを向上させるために、内部的に複数の時間を割り当てる必要はありませんが、わかりません。 割り当てる前にこれを考慮して割り当てられていますか?

してください。割り当て(予約)してからサイズを割り当て、次に挿入/コピーしますか?

注:私はベクターに機能を割り当てる(スタンダード::ベクトル::アサイン)

例を意味割り当てる-with: -

void test_func(char* bigarray) 
{ 
    std::vector<char> v_data; 
    int len=strlen(bigarray); 
    v_data.reserve(len); 
    v_data.assign(bigarray,bigarray+len); 
} 
+5

あなたが使用しているコードを投稿してください –

+0

ありがとうございます。私はコードを追加しました、今質問はもっと明確です –

答えて

1

私はこの質問が誰かがこれを尋ねるのに完全に有効であるように、なぜこの質問が下落したのか分かりません。間違った結果を出すかもしれないし、

とにかく...ベクトルに割り当てようとしているまともなサイズの配列を持っているなら、割り当てる前にreserve()を行うほうが確かに早いでしょう。しかし、必ずしもそうでないかもしれないといういくつかの注意点があります。実際、それはおそらく実装に依存するでしょう。

ベクトルは作成時にあらかじめ定義されたサイズになります。したがって、assign()が実行されると、ベクターに配列要素のコピーが開始されます。ベクトルがその容量に達すると、別の割り当てを行い(1.5倍または多分2倍の割り当て戦略と思います)、あるベクトルから別のベクトルへ要素をコピーします。ただし、この割り当ては実際にメモリを拡張します(オペレーティングシステムが許可するかどうかによって異なります)。このコピー操作は行われません。あなたのコントロール下にないので、これを予測することはできません。

入力配列が既知のサイズの場合、これらの再割り当て/コピー操作を避けるために、必要なスペースを事前に予約することをお勧めします。しかし、あなたはこれよりも一歩進んでいくことができます。ベクトルコンストラクタは、インスタンス化の時点でサイズを指定できる引数をとります。これは、最初に予約する必要性を避けるでしょう。 (resize()とreserve()の違いを理解する必要があることに注意してください.1つは容量にのみ影響し、もう1つは指定されたサイズのベクトルを作成します)

作成する場合は、指定されたサイズのベクトルであれば、はるかに少ない要素を挿入したとしても、ベクトルのsize()はそのサイズになります。 (あなたは要素をアクセスして挿入するために演算子[]を使用します)

あなたがおそらくあなた自身に尋ねるはずの質問です:配列内にデータが含まれている場合は、それを移動する目的は何ですかダイナミックコンテナに入れて本当に必要ですか?

+0

ダウン投票について。 \t 私の誤りかもしれません。質問は正しくフレーム化されておらず、編集(編集)されました。 –

+0

ベクトルが割り当てを拡張し、容量が大きくなったときに要素のコピーを避けるプラットフォームを1つ指定できますか? –

4

はい。

おそらく。

多分。

テストしてご覧ください。

+0

"いいえ"リストから欠落しています。 –

+0

尋ねられた質問については、* reserve *とassignはおそらくUBになります。 – krzaq

+1

@krzaq: 'assign()'メンバ関数が使われている場合ではありません。 –

関連する問題