私の知る限り、CPUは、そのデータムのサイズに等しい境界に位置合わせされたデータムで最高のパフォーマンスを発揮します。たとえば、すべてのint
データのサイズが4バイトの場合int
、CPUを満足させるには、すべてのアドレスを4の倍数にする必要があります。2バイトshort
データと8バイトデータで同じdouble
です。このため、new
演算子とmalloc
関数は常に8の倍数であるため、4と2の倍数であるアドレスを返します。
私のプログラムでは、大きなバイト配列を処理することを目的としたいくつかのタイムクリティカルなアルゴリズムにより、連続する各4バイトをに変換することで計算をunsigned int
進め、このようにして演算をはるかに高速に実行できます。ただし、バイト配列の一部のみを処理する必要がある場合があるため、バイト配列のアドレスは4の倍数であるとは限りません。
私の知る限り、Intel CPUは、位置がずれたデータを適切に処理しますが、速度が犠牲になります。ずれたデータの操作が十分に遅い場合は、プログラムのアルゴリズムを再設計する必要があります。これに関連して、2つの質問があります。最初の質問は、次のコードでサポートされています。
// the address of array0 is a multiple of 4:
unsigned char* array0 = new unsigned char[4];
array0[0] = 0x00;
array0[1] = 0x11;
array0[2] = 0x22;
array0[3] = 0x33;
// the address of array1 is a multiple of 4 too:
unsigned char* array1 = new unsigned char[5];
array1[0] = 0x00;
array1[1] = 0x00;
array1[2] = 0x11;
array1[3] = 0x22;
array1[4] = 0x33;
// OP1: the address of the 1st operand is a multiple of 4,
// which is optimal for an unsigned int:
unsigned int anUInt0 = *((unsigned int*)array0) + 1234;
// OP2: the address of the 1st operand is not a multiple of 4:
unsigned int anUInt1 = *((unsigned int*)(array1 + 1)) + 1234;
したがって、質問は次のとおりです。
x86、x86-64、およびItaniumプロセッサのOP1と比較してOP2はどれくらい遅いですか(型キャストとアドレス増分のコストを無視した場合)?
クロスプラットフォームのポータブルコードを作成する場合、データアクセスの不整合に関してどのような種類のプロセッサを心配する必要がありますか?(私はすでにRISCのものについて知っています)