12

stl::vector の場合:

vector<int> v(1);
v[0]=1; // No bounds checking
v.at(0)=1; // Bounds checking

at()すべてを asに書き換えなくても境界チェックを無効にする方法はあり[]ますか? GNU 標準 C++ ライブラリを使用しています。

編集:ボトルネックが疑われる領域に変更at()[]たところ、計算時間が大幅に短縮されました。ただし、コードの開発とそれを使用した実験の実行を繰り返すため、開発中は境界チェックを有効にし、実際に実験を実行するときは無効にしたいと考えています。アンドリューのアドバイスが最善の解決策だと思います。

4

8 に答える 8

25

あなたが本当にそれをしたいのであれば(少なくとも迅速で汚いプロファイリング比較のために)、他at()の sがない場合はこれが機能します

#define at(x) operator[](x)

また、at()開発用に保持しoperator[]て本番環境で使用する場合は、#ifdef.

また、他の s がある場合は、いつでもdファイルat()を編集できます。#include<vector>

于 2010-03-05T07:37:08.017 に答える
15

いいえ。 の境界チェックはstd::vector::at標準で指定されており、標準から逸脱できる標準準拠の C++ 実装はありません。

于 2010-03-05T03:18:37.167 に答える
6

おそらく、より良い解決策は[]、デバッグ用の標準ライブラリのチェックされた実装を使用して使用することです。

于 2010-03-05T03:35:26.400 に答える
5

境界チェックをオン/オフしたいというコメントに基づいて、ラッパー テンプレート関数を使用できます。

template <class T>
inline typename T::reference deref(T &cont, typename T::size_type idx)
{
#if BOUNDS_CHECK
    return cont.at(idx);
#else
    return cont[idx];
#endif
}

template <class T>
inline typename T::const_reference deref(const T &cont, typename T::size_type idx)
{
#if BOUNDS_CHECK
    return cont.at(idx);
#else
    return cont[idx];
#endif
}

これを有効にするにはコードを変更する必要がありますが、一度コードを設定したら、必要に応じてバインド チェックをオンまたはオフにすることができます。

使い方が少し醜いことは認めます。

deref(vec, 10) = ...;
于 2010-03-05T08:12:14.593 に答える
3

標準的な方法ではありません。コンパイラで例外をオフにすることができます。gcc with でこれを行うことができます-fno-exceptions

ただし、これを行うには注意が必要です。ライブラリ (標準ライブラリを含む) は、例外がオフになっているとうまく動作しない可能性があります。ドキュメンテーションと、gcc メーリング リストのこのようなスレッドを確認してください。

于 2010-03-05T03:18:47.980 に答える
2

「uncheckedvector」のような独自の名前空間で独自のベクトルクラスを導出し、基本ベクトル型のat()をオーバーライドして、配列インデックスを使用します。

次に、「using uncheckedvector :: vector」を使用すると、あらゆる場所でのベクトルの使用をすべてオーバーライドできます。ただし、完全修飾型を使用している場合、これは機能しません。

于 2010-03-05T08:17:11.923 に答える
0

at()またはを使用するのではなく、合理的に一貫したアクセス パターン (つまり、ランダム アクセスではない) がある場合、範囲チェックを回避する 1 つの方法は、標準アルゴリズムを使用して、、 、またはさらに良い方法で[]イテレータを使用することです。begin()end()advance()

これは、範囲チェックの実行を修正するという根本的な問題を解決しませんat()が、標準ライブラリ (MSVC) の一部の実装では、一部のタイプのビルドの反復子をチェックしています。

于 2010-03-05T08:11:11.140 に答える