c++11 では、テンプレートを使用して配列 (例: ) の max_size を定義しますが、std::array<int, 5> a1;
コンストラクターは定義しません。(例std::array<int>(5) a1;
)
テンプレートはクラスのコードを生成するため、多数の配列がある場合はサイズが異なるだけなので、大量のコードが生成されます。
(1. コンパイル時間の増加の原因となる場合があります。 2. 実行ファイルのコード部分の膨張の原因となる場合があります。)
そうでなければ、それが何であるかを知ることができないからです。
std::array
配列です。動的なサイズの配列ではありません。ランタイムサイズの配列ではありません。これは、によく似た配列int arr[5]
です。
C ++は静的に型付けされた言語です。つまり、C++型はコンパイル時に定義されたサイズである必要があります。arr
上記の例ではサイズがあります。あなたがそうするならばsizeof(arr)
、あなたは得るでしょうsizeof(int) * 5
。sizeof(std::array<int, 5>)
サイズもあります。これは、その中の要素の数によって定義されます。したがって、サイズはコンパイル時に定義されたサイズを考慮に入れるため、コンパイル時に定義された量である必要があります。
通常のアレイとの違いは次のstd::array
とおりです。
std::array
ではない; そのためには、関数を明示的に呼び出す必要があります。std::array
、言語にとって、配列を含む構造体です。サイズが異なるだけの配列がたくさんある場合は、生成されるコードがたくさんあります。
はい、そうかもしれません。それではまた...これは深刻な懸念ですか?本当に実装を見たことがありますか?std::array
そこにはあまりありません。その関数T operator[](int index) { return elems[index]; }
の数百のインスタンス化を取得することは問題になるとは思わない。同じことが、、、などにも当てはまります。ほぼ確実にインライン化されるコードについて話しています。begin
size
empty
std::array
固定サイズの配列上の薄いラッパーとして意味されます。動的サイズの配列の場合、がありstd::vector
ます。
の利点の 1 つは、 (グローバル オブジェクトを宣言しない限り) 最小限のオーバーヘッドでスタックstd::array
にメモリを割り当てることです。
配列のサイズがコンストラクターのパラメーターによって決定された場合、割り当てはヒープ上で行う必要があり、一般に、結果のオブジェクトはメモリ使用量とパフォーマンスの点で効率が低下します。