次のようなものを想定します。
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
for(i=0; i<len; i++)
{
dest[i] = src[i] & mask[i];
}
}
次のように書くことで、アラインされていないアクセス マシン (x86 など) で高速化できます。
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
unsigned int wordlen = len >> 2;
for(i=0; i<wordlen; i++)
{
((uint32_t*)dest)[i] = ((uint32_t*)src)[i] & ((uint32_t*)mask)[i]; // this raises SIGBUS on SPARC and other archs that require aligned access.
}
for(i=wordlen<<2; i<len; i++){
dest[i] = src[i] & mask[i];
}
}
ただし、いくつかのアーキテクチャで構築する必要があるため、次のようなことをしたいと思います。
void mask_bytes(unsigned char* dest, unsigned char* src, unsigned char* mask, unsigned int len)
{
unsigned int i;
unsigned int wordlen = len >> 2;
#if defined(__ALIGNED2__) || defined(__ALIGNED4__) || defined(__ALIGNED8__)
// go slow
for(i=0; i<len; i++)
{
dest[i] = src[i] & mask[i];
}
#else
// go fast
for(i=0; i<wordlen; i++)
{
// the following line will raise SIGBUS on SPARC and other archs that require aligned access.
((uint32_t*)dest)[i] = ((uint32_t*)src)[i] & ((uint32_t*)mask)[i];
}
for(i=wordlen<<2; i<len; i++){
dest[i] = src[i] & mask[i];
}
#endif
}
しかし、アラインメントを指定するコンパイラ定義のマクロ (上記の私の仮説のようなもの__ALIGNED4__
) や、ターゲット アーキテクチャのアラインメントを決定するためにプリプロセッサを使用する巧妙な方法に関する良い情報を見つけることができません。をテストすることもできますが、アライメントされたメモリアクセスを必要とする他のアーキテクチャでJust Work TMdefined (__SVR4) && defined (__sun)
を実行できるものを好むでしょう。