ダブルポインタの配列と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;
   }
 }