スパース配列であるほとんどゼロのバイト配列を使用すると、一度に 4 バイトの比較を行うことで 32 ビット CPU を利用できます。実際の比較は一度に 4 バイトずつ行われますが、いずれかのバイトが非ゼロの場合、unsigned long のどのバイトが非ゼロであるかを判断する必要があるため、より多くの労力が必要になります。配列が本当にまばらである場合、比較で節約された時間は、どのバイトがゼロでないかを判断する追加の作業を補うことができます。
最も簡単な方法は、unsigned char 配列のサイズを 4 バイトの倍数にすることです。これにより、ループの完了後に最後の数バイトを実行することを心配する必要がなくなります。
これは純粋に推測であり、単純なループよりも時間がかかるほど十分に配列が疎になるポイントがあるため、これについてタイミング調査を行うことをお勧めします。
私が持つであろう 1 つの質問は、配列のゼロ以外の要素のオフセットのベクトルで何をしているのか、ベクトルをなくすことができるかどうかということです。別の質問は、要素を配列に配置するときにベクトルを構築できるかどうか、ベクトルが必要かどうかです。
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);
}
}