C++配列とベクトルのat()
関数は範囲外のチェックを提供するので、代わりにoperator[]
を使用するとパフォーマンスに大きな違いはありません。配列アクセスに角括弧[]または.at()を使用する必要がありますか?
おそらくパフォーマンスクリティカルなコードでのみですか?
C++配列とベクトルのat()
関数は範囲外のチェックを提供するので、代わりにoperator[]
を使用するとパフォーマンスに大きな違いはありません。配列アクセスに角括弧[]または.at()を使用する必要がありますか?
おそらくパフォーマンスクリティカルなコードでのみですか?
いずれも使用しないでください。 std::vector
は、索引によって項目に明示的にアクセスする必要がほとんどない反復機能を提供します。
はあなたが範囲外に行くのされていないことがわかっている場合at()
を使用する必要はありません、あなたはを使用していないもののために払っていない、次の、あなたの質問に答えるために。
そうでなければ、逆参照しようとするたびにnullptr
でないポインタをチェックするべきですが、実際にはそれが有効なポインタであると確信している場合は実行しません。
どのようなstd :: vectorの繰り返し機能ですか?あなたはリンクを提供したり、それ以上詳しく説明してもらえますか? –
'
「範囲外」アクセスが発生しないことが確実である場合は、[]
を使用する必要があります。
at()
を使用する必要があります
定義されていない方法で[]
を使用しました)。
(後でat(i)からoperatorに変更するのは面倒です。したがって、私はJesperに同意します。
問題を解決するには、次のようにします。 valgrindを使用するか、-D_GLIBCXX_DEBUGを指定してGCCコンパイルを使用している場合は使用してください。詳細はGCC Debug modeを参照してください。
これは痛みを伴うかもしれませんが、これらのデバッグ機能を持たないと痛みが増し、選択肢はいくつかの '[]'呼び出しを 'at()'に置き換えるか、デバッグに時間を費やします。 – PaulMcKenzie
at()の代わりに境界チェックのためのアサートを使用する方が良いですか?アサーションはリリースビルドで削除される予定ですか? –
@ J-Win 'assert()'の問題は、リリースビルドで削除されたことです。バグがリリースビルドにのみ表示される場合はどうなりますか? – PaulMcKenzie
私たちのプログラムには境界アクセスの問題がないと確信しているので、私はあなたがat()
を使用して開始する必要はないと思います。したがってすぐに[ ]
を使い始めます。
しかし、境界問題を検出するためにat()
を使用した場合、簡単に解決できた可能性のあるベクトルアクセスに関する多くの質問がSOの記事(新しいプログラマ)によって行われています。
このような経験がある場合は、範囲外になっていると思われる場合、または範囲外になる可能性があるというヒントがある場合は、デバッグの目的でat()
を使用してください。
_ "私たちのプログラムには境界アクセスの問題がないと確信しているからです" _私たちは何ですか? –
私はそれをいくつかの風刺で書いていますが、良いプログラマは自信を持っています。 – PaulMcKenzie
私はその自信がないという自信があります。 –
あなたは良い人であるため、インデックスが境界内にあるかどうかを知ることができ、重複してインデックスを確認する必要はありません。角かっこを使用します。 –
_ "代わりに演算子[]を使用するとパフォーマンスに大きな違いはありません。" [要注意] –