对于一个大部分为零的字节数组,作为一个稀疏数组,您可以通过一次比较 4 个字节来利用 32 位 CPU。实际比较一次完成 4 个字节,但是如果任何字节不为零,那么您必须确定 unsigned long 中的哪些字节不为零,这样会花费更多的精力。如果数组真的很稀疏,那么通过比较节省的时间可以补偿确定哪些字节非零的额外工作。
最简单的方法是将 unsigned char 数组的大小设置为 4 字节的倍数,这样您就不必担心循环完成后的最后几个字节。
我建议对此进行时序研究,因为这纯粹是推测性的,并且会有一个点数组变得不够稀疏,以至于这比简单的循环需要更多的时间。
我会遇到的一个问题是,您对数组的非零元素的偏移量向量做了什么,以及您是否可以取消该向量。另一个问题是,如果您需要向量,是否可以在将元素放入数组时构建向量。
unsigned char* array=new unsigned char[4000000];
......
unsigned long *pUlaw = (unsigned long *)array;
for ( ; pUlaw < array + 4000000; pUlaw++) {
if (*pUlaw) {
// at least one byte is non-zero
unsigned char *pUlawByte = (unsigned char *)pUlaw;
if (*pUlawByte)
somevector.push_back(pUlawByte - array);
if (*(pUlawByte+1))
somevector.push_back(pUlawByte - array + 1);
if (*(pUlawByte+2))
somevector.push_back(pUlawByte - array + 2);
if (*(pUlawByte+3))
somevector.push_back(pUlawByte - array + 3);
}
}