C++ - 最快的检查数组边界
C++ - Fastest check array bounds
我需要一种非常快速的方法来检查数组的边界。我目前的检查边界是:
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 的情况,但如果对size
和index
变量使用 unsigned
或 size_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];
}
相关文章:
- 试图让变量检查数组中的某些内容
- 使用for循环检查数组中的重复项
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 如何检查数组中是否没有值
- 检查数组中的字符对
- 如何检查数组的 3 个元素是否具有相同的值
- 检查彩虹数组(检查数组的反向样式是否与自身匹配)
- 检查数组是否等于的最快方法?
- 如何检查数组是否包含多个元素?
- 检查数组的邻居值
- 检查数组行中每行C++是否始终存在相同的值
- 如果元素的数量已经知道,检查数组或向量中的所有元素是否相等更好?
- 检查数组中的所有对是否都能被 k 整除
- 检查数组中的任何值是否等于添加到数组的当前值
- 如何检查数组中的索引是否为空
- 使用 auto 时不检查数组边界
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 如何检查数组中的每个元素是否为素数
- 检查数组中的给定 K 元素
- 检查数组是否'right' (C++)