Если вы определите:
int my_array[10][10][10];
Одна вещь, которая требуется, это значение индексов в отношении хранения. my_array[1][2][3]
находится в памяти рядом с my_array[1][2][4]
, но не с my_array[1][3][3]
. my_array[2][2][3]
еще дальше. Это может повлиять на производительность при увеличении одного или другого индекса - увеличение последнего индекса обычно происходит быстрее, поскольку вы получаете больше обращений в кэш.
Пример:
const int K = 400;
int my_array[K][K][K];
int main() {
for (int i = 0; i < K; ++i) {
for (int j = 0; j < K; ++j) {
for (int k = 0; k < K; ++k) {
#ifdef FAST
my_array[i][j][k] = 12;
#else
my_array[k][j][i] = 12;
#endif
}
}
}
}
Выход:
$ g++ looporder.cpp -o looporder && time ./looporder
real 0m2.500s
user 0m2.249s
sys 0m0.155s
$ g++ looporder.cpp -o looporder -DFAST && time ./looporder
real 0m0.516s
user 0m0.327s
sys 0m0.124s
$ g++ looporder.cpp -o looporder -O3 && time ./looporder
real 0m2.234s
user 0m2.140s
sys 0m0.093s
$ g++ looporder.cpp -o looporder -DFAST -O3 && time ./looporder
real 0m0.250s
user 0m0.171s
sys 0m0.108s
Что означают индексы с точки зрения того, что на самом деле хранится, зависит только от вас - поскольку вы говорите, что это просто вопрос "каким путем" ваш куб. Поэтому обычно вы выбираете их так, чтобы все, что вы увеличиваете в самом внутреннем цикле, было последним измерением.