Travailler avec des tableaux à 3 dimensions
Bonjour,
j'ai un tableau d'unsigned short à 3 entrées, par exemple :
Code:
unsigned short myTab[4][4][256 * 256];
Il très important, pour mon utilisation, de garder cette notion de tri-dimensionalité. Et lorsque je traite un tableau[i][j][256 * 256], je n'utilise pas les autres tableaux[x][y][256 * 256].
Je sais que l'utilisation de tableaux uni-dimensionnels est préférée à des tableaux mutli-dimensionnels ; les temps d'accès aux éléments d'un tableau multi-dimensionnels sont plus longs.
Par contre, quelle est la meilleure solution ?
Cas n°1 : myTab devient un tableau uni-dimensionnel, et j'utilise des offsets pour accéder aux parties qui m'intéressent :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
unsigned short myTab[4 * 4 * 256 * 256];
int offset00 = 0;
int offset01 = offset00 + 256 * 256;
int offset02 = offset01 + 256 * 256;
int offset03 = offset02 + 256 * 256;
int offset10 = offset03 + 256 * 256;
//... etc ...
int offset33 = offset32 + 256 * 256;
// et pour accéder à mon "original" myTab[2][1][65]
myTab[offset21 + 65] = 8; |
Par contre je risque d'encombrer le cache inutilement puisque, comme le l'ai dit plus haut, lorsque je traite un tableau[i][j][256 * 256], je n'utilise pas les autres tableaux[x][y][256 * 256].
Cas n°2 : je déclare 16 tableaux de 256 * 256 que je réunis dans un tableau de pointeurs :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| unsigned short myTab00[256 * 256];
unsigned short myTab01[256 * 256];
unsigned short myTab02[256 * 256];
unsigned short myTab03[256 * 256];
unsigned short myTab10[256 * 256];
unsigned short myTab11[256 * 256];
unsigned short myTab12[256 * 256];
unsigned short myTab13[256 * 256];
//... etc ...
// je réunis le tout dans une table de pointeurs
unsigned short * ptrOnMyTab[4][4];
ptrOnMyTab[0][0] = &myTab00[0];
ptrOnMyTab[0][1] = &myTab01[0];
ptrOnMyTab[0][2] = &myTab02[0];
ptrOnMyTab[0][3] = &myTab03[0];
ptrOnMyTab[1][0] = &myTab10[0];
//... etc ...
// et pour accéder à mon "original" myTab[2][1][65]
ptrOnMyTab[2][1][65] = 8; |
Dans ce cas, je me demande si ça ne revient pas finalement au cas original myTab[4][4][256*256]
Alors qu'elle est la meilleure solution au final ?
Merci
Flo.