1

bitset::operator[] の使用は bitset::test の使用と同等ですか、それとも根本的な最適化がありますか?

つまり、これら 2 つのループは同等ですか?

bitset::operator[] の使用:

static const int UP = 0;
static const int DOWN = 1;

for(int i = 1; i < KEY_MAX; ++i) {
    if(_handler && (_prevKey[i] == UP && _curKey[i] == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
    }
    if(_handler && (_prevKey[i] == DOWN && _curKey[i] == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
    }
    if(_handler && (_prevKey[i] == DOWN && _curKey[i] == UP)) {
        _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
    }
}

bitset::test() の使用:

static const bool UP = false;
static const bool  DOWN = true;

for(int i = 1; i < KEY_MAX; ++i) {
    if(_handler && (_prevKey.test(i) == UP && _curKey.test(i) == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
    }
    if(_handler && (_prevKey.test(i) == DOWN && _curKey.test(i) == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
    }
    if(_handler && (_prevKey.test(i) == DOWN && _curKey.test(i) == UP)) {
        _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
    }
}
4

3 に答える 3

3

C++03 標準、§23.3.5.2/39-41 から:

bool test(size_t pos) const;

必須: pos有効です
スロー: 有効なビット位置に対応しないout_of_range場合。戻り値:位置のビットの値が 1 の場合。pos
truepos*this

§23.3.5.2/46-48:

bool operator[](size_t pos) const;

必須: pos有効です。
スロー:なし。
戻り値: test(pos) .

§23.3.5.2/49-51:

bitset<N>::reference operator[](size_t pos);

必須: pos有効です。
スロー:なし。
戻り値:、および と同等bitset<N>::referenceの型のオブジェクト。(*this)[pos] == this- test(pos)(*this)[pos] = valthis->set(pos, val)

したがって、オブジェクトが の場合、が無効である場合は何もスローされず、がスローconstされる場合を除いて、同じ値が返されます。オブジェクトが でない場合、オペレーターはプロキシ オブジェクトを返し、オブジェクトのデータを変更できるようにします。postestout_of_rangeoperator[] const

于 2011-08-20T03:45:13.280 に答える
0

アクセス演算子 ([]) とは異なり、テスト関数はビット値を取得する前に位置の範囲チェックを実行します。位置が有効なビット位置でない場合、out_of_range がスローされます。

参照先は次のとおりです。

http://www.cplusplus.com/reference/stl/bitset

于 2011-08-20T03:47:27.347 に答える
0

私はこのように最適化します:

int nPrevKey, nCurKey;

for(int i = 1; i < KEY_MAX; ++i) 
{
    if(_handler)
    {
        nPrevKey = _prevKey[i];
        nCurKey = _curKey[i];

        if(nPrevKey == UP && nCurKey  == DOWN)
        {
            _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
        }
        if(nPrevKey  == DOWN && nCurKey  == DOWN)
        {
            _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
        }
        if(nPrevKey  == DOWN && nCurKey  == UP)
        {
            _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
        }
    }
}

同様に、他の実装。

于 2011-08-20T11:29:08.863 に答える