質問

いくつかの場所で使用を推奨しているのを見ました std::array C++ の C スタイルの配列よりも、オーバーヘッドのない、より優れた安全な代替手段であると主張しています。見る:

標準のコンテナアレイ[...]には、要素を保持するために必要なものを超えるスペースオーバーヘッドはありません[...]。言い換えれば、それは問題のない組み込みアレイに非常によく似ています。(C++11 よくある質問)

ただし、私が理解しているように、そこにはテンプレートコンテナーがあるため、 意思 配列がインスタンス化されている異なる N ごとにコードを生成するため、プログラム サイズに関してはオーバーヘッドになります。

私のプログラムが次のように使用すると仮定します std::array さまざまな場所で N に複数の異なる整数を使用すると、コードが肥大化するでしょうか?それは無視できるものですか?

一般に、型以外のテンプレート パラメーターについてこれについて心配する必要がありますか?

役に立ちましたか?

解決

心配することはありません。インターフェースを見てみると、 std::array<T, N>, これは非常に小さく、ほとんどのメンバー関数 (基本的にポインター操作用のラッパーを提供する) はワンライナーであり、リリース モード最適化レベルのまともなコンパイラーによって完全に最適化され、インライン化されます。

さらに、 使わないものにはお金を払わない 未使用の非仮想メンバー関数があるため (std::array<T, N> 持っていない virtual クラス テンプレートのメンバー関数) はインスタンス化されないことが保証されます。小規模な標準見積もり:

14.7.1 暗黙的なインスタンス化 [temp.inst]

11実装は、関数テンプレート、可変テンプレート、メンバーテンプレート、非ナートメンバー関数、メンバークラス、またはインスタンス化を必要としないクラステンプレートの静的データメンバーを暗黙的にインスタンス化してはなりません。[...]

オーバーロードされた関係演算子もいくつかあります == そして < 意味的には以下と同等です std::equal そして std::lexicographical_compare. 。実際には、これらの演算子もこれらのアルゴリズムの観点から実装する必要があります (実装していない場合はベンダーに苦情を申し立ててください)。

唯一の非常に小さな懸念は、コンパイル時のオーバーヘッドが少し余分にかかることですが、コード サイズと実行時のオーバーヘッドはゼロになるはずです。

関連していますが同一ではありません:の C++ パフォーマンスに関するテクニカル レポート 組み込み型 (int, double) 2006 コンパイラ テクノロジではオーバーヘッドがほぼゼロであることがわかりました。テストを繰り返してこれを確認することもできます std::array<T,N>T[N]

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top