我需要一种非常快速的方法来检查数组的边界。 我目前的检查范围是:
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];
}
}
有更快的方法来检查索引是否超出数组边界?
编辑:
我的解决方案是使用负索引制造麻烦。 有办法解决这个问题吗?
答案 0 :(得分:5)
一般来说,分工是一个缓慢的操作,所以我会避免这种情况。
我认为简单的比较会更有效:
index >= size
但是,如果index
小于0但是对unsigned
和size_t
变量使用size
或index
,则会出现这种情况那不会是个问题。
所以它变成了:
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];
}