C ++ - 最快的检查数组边界

时间:2012-09-26 16:44:26

标签: c++ arrays

我需要一种非常快速的方法来检查数组的边界。 我目前的检查范围是:

template<typename T>
class SmartArray {
    //...
    int size;
    T* array;
    T &operator[](int index) {
        if (index/size!=0)
            throw OUT_OF_RANGE; //#define OUT_OF_RANGE 0x0A
        return array[index];
    }
}

有更快的方法来检查索引是否超出数组边界?

编辑:

我的解决方案是使用负索引制造麻烦。 有办法解决这个问题吗?

5 个答案:

答案 0 :(得分:5)

一般来说,分工是一个缓慢的操作,所以我会避免这种情况。

我认为简单的比较会更有效:

index >= size

但是,如果index小于0但是对unsignedsize_t变量使用sizeindex,则会出现这种情况那不会是个问题。

所以它变成了:

T &operator[](size_t index) {
    if (index >= size)
        throw OUT_OF_RANGE; //#define OUT_OF_RANGE 0x0A
    return array[index];
}

答案 1 :(得分:3)

是的,不要使用除法,因为除法很慢(加上如果size == 0则失败)。一个简单的

if(index >= size || index < 0)

会做得很好。

答案 2 :(得分:2)

您的检查错过了负值:如果大小为5且索引为-1,则整数除法的结果为零,但索引明显超出范围。

您可以通过使index参数无符号来解决此问题。 size的类型也应为size_t

答案 3 :(得分:1)

检查数组边界的最快方法是不检查。 operator[]的来电者应该负责确保他们知道自己在做什么,而不是用不好的索引来称呼它。

答案 4 :(得分:0)

如果将数组的大小限制为2的幂,则可以使用屏蔽。这是存储额外值size_t mask;,等于size-1== 2^n-1)。然后检查可能会完成:

T &operator[](size_t index) {
    return array[index & mask];
}