2

c++11 では、テンプレートを使用して配列 (例: ) の max_size を定義しますが、std::array<int, 5> a1;コンストラクターは定義しません。(例std::array<int>(5) a1;)

テンプレートはクラスのコードを生成するため、多数の配列がある場合はサイズが異なるだけなので、大量のコードが生成されます。

(1. コンパイル時間の増加の原因となる場合があります。 2. 実行ファイルのコード部分の膨張の原因となる場合があります。)

4

3 に答える 3

13

そうでなければ、それが何であるかを知ることができないからです。

std::array配列です。動的なサイズの配列ではありません。ランタイムサイズの配列ではありません。これは、によく似た配列int arr[5]です。

C ++は静的に型付けされた言語です。つまり、C++型はコンパイル時に定義されたサイズである必要があります。arr上記の例ではサイズがあります。あなたがそうするならばsizeof(arr)、あなたは得るでしょうsizeof(int) * 5sizeof(std::array<int, 5>)サイズもあります。これは、その中の要素の数によって定義されます。したがって、サイズはコンパイル時に定義されたサイズを考慮に入れるため、コンパイル時に定義された量である必要があります。

通常のアレイとの違いは次のstd::arrayとおりです。

  • 配列は暗黙的にポインタに減衰します。std::arrayではない; そのためには、関数を明示的に呼び出す必要があります。
  • 配列は言語配列です。std::array、言語にとって、配列を含む構造体です。

サイズが異なるだけの配列がたくさんある場合は、生成されるコードがたくさんあります。

はい、そうかもしれません。それではまた...これは深刻な懸念ですか?本当に実装を見たことがありますか?std::array

そこにはあまりありません。その関数T operator[](int index) { return elems[index]; }の数百のインスタンス化を取得することは問題になるとは思わない。同じことが、、、などにも当てはまります。ほぼ確実にインライン化されるコードについて話しています。beginsizeempty

于 2012-11-30T08:11:04.607 に答える
7

std::array固定サイズの配列上の薄いラッパーとして意味されます。動的サイズの配列の場合、がありstd::vectorます。

于 2012-11-30T08:09:35.807 に答える
1

の利点の 1 つは、 (グローバル オブジェクトを宣言しない限り) 最小限のオーバーヘッドでスタックstd::arrayにメモリを割り当てることです。

配列のサイズがコンストラクターのパラメーターによって決定された場合、割り当てはヒープ上で行う必要があり、一般に、結果のオブジェクトはメモリ使用量とパフォーマンスの点で効率が低下します。

于 2012-11-30T08:14:46.683 に答える