5

重複の可能性:
std :: vectorはプレーン配列よりもはるかに遅いですか?

ベクトルがスタックではなくヒープに割り当てられているようです。

では、パフォーマンスが深刻な問題になる場合は、(可能であれば)ベクトルの代わりに配列を使用することを検討する必要がありますか?

4

3 に答える 3

19

いいえ(コメントの衒学者を満足させるために、いいえ、パフォーマンスのためにベクトルよりも配列を「優先」するべきではありませんが、以下に概説する特定のケースでは、ベクトルを置き換えるために配列を使用することを「検討」する必要があります)

パフォーマンスが深刻な問題になる場合は、中古の話や伝聞や迷信ではなく、実際のデータに基づいて最適化を行う必要があります

ベクトルを配列に置き換えると、測定可能な(そして必要な)スピードアップが得られる場合は、それを実行する必要があります。

ただし、次の場合にのみ、スタック割り当て配列を使用できることに注意してください。

  • サイズはコンパイル時にわかっており、
  • サイズは問題なくスタックに収まるほど小さいです。
  • サイズは動的ではなく固定する必要があります。

ほとんどの場合、これらの条件は当てはまりません。その場合、アレイはとにかくヒープに割り当てられる必要があり、アレイが持っていた1つの利点が失われます。

しかしこれらすべての条件が当てはまりこのヒープ割り当てが実際にパフォーマンスにかなりの悪影響を及ぼしていることがわかる場合は、そうです。配列(またはstd::array)に切り替えることは理にかなっています。

さもないと?いいえ...

于 2012-07-26T08:26:30.733 に答える
5

要素の数がコーディング時に事前にわかっている場合は、そうです。配列を使用することをお勧めします。C ++11はこれを提供します:

std::array<int,10000> arr;

ただし、これは使用しないでください。

int arr[10000]; //avoid it in C++11 (strictly), and possibly in C++03 also!

C ++ 03ではstd::vector、ほとんどの場合(実験で遅いことが示されない限り)、引き続き優先する必要があります。

std::vector<int> arr;
arr.reserve(10000); //it is good if you know the (min) number of items!

ほとんどの場合、ベクトルが遅いように見える場合、それはプログラマーが関数を利用していないためですreserve()。代わりに、ベクトルがそれ自体のサイズを変更するときに、割り当て-割り当て解除-コピーの繰り返し戦略に依存します。

于 2012-07-26T08:30:33.583 に答える
0

例外的なシステム(つまり、メモリアロケータが遅いシステム)で実行している場合を除いて、大きな違いが生じる可能性はほとんどありません。プレーン配列よりも型の安全性が高いため、代わりにstd::vectorを使用することをお勧めします。

于 2012-07-26T08:27:13.933 に答える