2016-07-06 6 views
1

C++配列とベクトルのat()関数は範囲外のチェックを提供するので、代わりにoperator[]を使用するとパフォーマンスに大きな違いはありません。配列アクセスに角括弧[]または.at()を使用する必要がありますか?

おそらくパフォーマンスクリティカルなコードでのみですか?

+1

あなたは良い人であるため、インデックスが境界内にあるかどうかを知ることができ、重複してインデックスを確認する必要はありません。角かっこを使用します。 –

+2

_ "代わりに演算子[]を使用するとパフォーマンスに大きな違いはありません。" [要注意] –

答えて

5

いずれも使用しないでください。 std::vectorは、索引によって項目に明示的にアクセスする必要がほとんどない反復機能を提供します。

はあなたが範囲外に行くのされていないことがわかっている場合at()を使用する必要はありません、あなたはを使用していないもののために払っていない、次の、あなたの質問に答えるために。

そうでなければ、逆参照しようとするたびにnullptrでないポインタをチェックするべきですが、実際にはそれが有効なポインタであると確信している場合は実行しません。

+0

どのようなstd :: vectorの繰り返し機能ですか?あなたはリンクを提供したり、それ以上詳しく説明してもらえますか? –

+0

''ヘッダは、std :: vectorをループしたり、インデックスでオブジェクトを検索したりすることなく、STLコンテナ上のほとんどすべてを処理する関数を提供します。 http://en.cppreference.com/w/cpp/algorithm – Jack

4

「範囲外」アクセスが発生しないことが確実である場合は、[]を使用する必要があります。

「範囲外」のアクセス はそれがとにかく持っていたことになる(起こる可能性があり、あなたはそれのいずれかの契約に用意されている(例外をキャッチし、賢明な何かをすることによって)、または、プログラムがクラッシュがOKであるときは、 at()を使用する必要があります

定義されていない方法で[]を使用しました)。

2

(後でat(i)からoperatorに変更するのは面倒です。したがって、私はJesperに同意します。

問題を解決するには、次のようにします。 valgrindを使用するか、-D_GLIBCXX_DEBUGを指​​定してGCCコンパイルを使用している場合は使用してください。詳細はGCC Debug modeを参照してください。

+0

これは痛みを伴うかもしれませんが、これらのデバッグ機能を持たないと痛みが増し、選択肢はいくつかの '[]'呼び出しを 'at()'に置き換えるか、デバッグに時間を費やします。 – PaulMcKenzie

+0

at()の代わりに境界チェックのためのアサートを使用する方が良いですか?アサーションはリリースビルドで削除される予定ですか? –

+0

@ J-Win 'assert()'の問題は、リリースビルドで削除されたことです。バグがリリースビルドにのみ表示される場合はどうなりますか? – PaulMcKenzie

1

私たちのプログラムには境界アクセスの問題がないと確信しているので、私はあなたがat()を使用して開始する必要はないと思います。したがってすぐに[ ]を使い始めます。

しかし、境界問題を検出するためにat()を使用した場合、簡単に解決できた可能性のあるベクトルアクセスに関する多くの質問がSOの記事(新しいプログラマ)によって行われています。

このような経験がある場合は、範囲外になっていると思われる場合、または範囲外になる可能性があるというヒントがある場合は、デバッグの目的でat()を使用してください。

+2

_ "私たちのプログラムには境界アクセスの問題がないと確信しているからです" _私たちは何ですか? –

+2

私はそれをいくつかの風刺で書いていますが、良いプログラマは自信を持っています。 – PaulMcKenzie

+0

私はその自信がないという自信があります。 –

関連する問題