ダブルポインタの配列と1次元配列
Aは、ダブルポインタを使った2次元配列のmalloc。以下のAは、配列の領域を確保し、0で初期化するコードである。
Bは、ポインタの一次元配列を静的にプールしたもの。その後、0で初期化する。
AよりもBのほうが高速に動作する。
理由は一つの要素へのメモリアクセス回数がダブルポインタが2回に対し、一次元配列では1回で済むため。
A
unsigned char **ch; ch = malloc(HEIGHT_SIZE * sizeof(unsigned char*)); if(ch == NULL)exit(1); for(i=0;i<HEIGHT_SIZE;i++){ ch[i] = malloc(WIDTH_SIZE * sizeof(unsigned char)); if(ch[i] == NULL)exit(1); } for(i=0;i<HEIGHT_SIZE;i++){ for(j=0;j<WIDTH_SIZE;j++){ ch[i][j]=0; } }
B
unsigned char *ch[HEIGHT_SIZE*WIDTH_SIZE]; for(i=0;i<HEIGHT_SIZE;i++){ for(j=0;j<WIDTH_SIZE;j++){ *ch[i*WIDTH_SIZE+j]=0; } }