Являются ли индексы для трехмерных массивов строго определенными? - PullRequest
4 голосов
/ 06 марта 2010

Допустим, я заявляю это:

int [a][b][c];

a обозначает уровень / страницу, b строка и c столбец?

Или это может быть что угодно, например, a обозначает столбец, b обозначает страницу, а c обозначает строку (так как данные это просто данные и куб можно абстрагировать любым способом)?

Ответы [ 2 ]

7 голосов
/ 06 марта 2010

Если вы определите:

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

Что означают индексы с точки зрения того, что на самом деле хранится, зависит только от вас - поскольку вы говорите, что это просто вопрос "каким путем" ваш куб. Поэтому обычно вы выбираете их так, чтобы все, что вы увеличиваете в самом внутреннем цикле, было последним измерением.

7 голосов
/ 06 марта 2010

Все, что вы хотите в любом порядке, обозначения строки и столбца - это условные обозначения. Расположение в памяти будет http://en.wikipedia.org/wiki/Row-major_order в C ++, эта часть не может быть изменена.

То, как вы перебираете элементы, во многих случаях влияет на производительность. Вы хотите изменить самый правый индекс в самом внутреннем цикле, чтобы последовательно перемещаться по памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...