7

コピーされた len を返す ac スタイル関数を使用しなければならない状況にあります。サイズを最大に変更し、返された長さにサイズ変更して、メモリとして渡されたベクトルのサイズを展開することにしました

resize が値を fillValue (常に 0?) に設定することは知っています。そのため、毎秒 60 回の無意味な初期化 (できれば毎回 1 MB 未満) が発生します。サイズ変更時の開始を無効にする方法はありますか?

4

1 に答える 1

11

基本的にいいえ。ベクトルの要素は、サイズ変更時にデフォルトで構築されます (整数の場合、これは 0 になります)。

resize() がメモリを割り当てないように reserve() を使用していると仮定すると、後でパフォーマンスの問題であることが判明しない限り、これについて心配する必要はありません。

心配な場合は、通常の配列を使用して、項目数を別の変数に格納することを検討してください。これにより、最高のパフォーマンスが得られます。

アップデート:

ジョンは尋ねました:

コンストラクターは本当にそのメモリをゼロにすることが保証されていますか? 私はそれが未定義だと思いましたか?

はいといいえ。プリミティブ型 (int、bool、float など) には、ゼロに初期化するデフォルトのコンストラクターがあります。ただし、通常のクラスや構造体とは異なり、コンパイラはそれらを自動的に呼び出しません。

例えば

int a;         // uninitialized
int b = int(); // initialized to 0

vector::resize は項目を追加するときに後者の形式を使用するため、作成された要素が正しくゼロに初期化されることが保証されます。これは、要素を暗黙的に作成するすべての STL コレクションに当てはまります。

于 2009-03-03T19:59:17.883 に答える