我想在此example中实现一个Handletype。
(长话短说:结构Handle
将index
- 成员保存到包含元素的数组中。其他成员count
验证index
是否为最新,对应于数据countArray
。count
和countArray
具有固定大小的类型/位域(u32:20bits))
为避免被限制在生成/计数器大小的20位,我想到了以下内容:为什么不让unsigned char count/countArray
故意溢出?
我也可以使用modulo方法( counter = ++counter % 0xff )
做同样的事情,但那是另一个额外的操作。
因此,当0xff
发生时,让计数增长到0
并且溢出将再次设置为0xff + 1
。
这是合法的吗?
这是我的伪实现(C ++):
struct Handle
{
unsigned short index;
unsigned char count;
};
struct myData
{
unsigned short curIndex;
int* dataArray;
unsigned char* countArray;
Handle create()
{
// check if index not already used
// create object at dataArray[handle.index]
Handle handle;
handle.index = curIndex;
handle.count = countArray[curIndex];
return handle;
}
void destroy( const Handle& handle )
{
// delete object at dataArray[handle.index]
countArray[handle.index]++; // <-- overflow here?
}
bool isValid( const Handle& handle ) const
{
return handle.count == countArray[handle.index];
}
};
编辑#1:是的,这些整数类型都应该是无符号的(如索引所示)
答案 0 :(得分:1)
只要您不使用signed
类型,就可以安全了。
从技术上讲,unsigned
类型不会溢出:
46)这意味着无符号算术不会溢出,因为a 结果无法由结果无符号整数表示 type是以大于最大值的数量减少的模数 可以由结果无符号整数类型表示的值。