series_of_data は実際には割り当てられていません。
2D 配列を割り当てるにはさまざまな方法があります。キャッシュの一貫性が悪く、通常はパフォーマンスが悪い行モデルの配列を使用するか、1 つの巨大な h*w メモリを割り当てることで構成される C の数値レシピでアドバイスされている Iliffe ベクトルを使用します。ブロックと、行 (または列) の先頭を含むサイド ポインター配列:
DATUM** alloc_array( int h, int w )
{
int i;
DATUM** m = (DATUM**)malloc(h*sizeof(DATUM*));
m[0] = (DATUM*)malloc(h*w*sizeof(DATUM));
for(i=1;i<h;i++) m[i] = m[i-1]+w;
return m;
}
void release_array(DATUM** m)
{
free( m[0] );
free( m);
}
int main()
{
int r,c;
DATUM** tab;
int width = 5;
int height = 3;
tab = alloc_array(height, width); /* column first */
for(r = 0;r<height;++r)
for(c = 0;c<width;++c)
tab[r][c] = (1+r+c);
for(r = 0;r<height;++r)
{
for(c = 0;c<width;++c)
{
printf("%d\t",tab[r][c]);
}
puts("");
}
release_array(tab);
}
データはメモリにうまく詰め込まれているので、キャッシュは問題なく、[][] アクセス パターンを維持できます。速度の問題として、これは従来の DATUM* + 多項式アクセス方式の +/-3% の速度です。