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

C++ - Fastest check array bounds

本文关键字:检查 数组 边界 C++      更新时间:2023-10-16

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

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];
    }
}

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

编辑:

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

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

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

index >= size

但是,这会错过index小于 0 的情况,但如果对sizeindex变量使用 unsignedsize_t,那将不是问题。

所以它变成了:

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

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

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

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

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

会做得很好。

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

如果将

数组的大小限制为 2 的幂,则可以使用屏蔽。即存储附加值size_t mask;等于 size-1== 2^n-1 )。然后可以进行检查:

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