Я понимаю основную концепцию шага (расстояние между двумя последовательными обращениями к массиву).Тем не менее, когда мне задают вопрос о том, как обстоят дела с различными типами циклов, обращающихся к одному и тому же массиву, я не уверен в том, какой точный ответ.
Например, я не уверен, как рассчитать доступ к массиву.во вложенных циклах.Вот два примера вопросов, на которых я застрял:
Функция A:
int i, j, k;
for (i = 0; i < MSIZE; i++) {
for (j = 0; j < MSIZE; j++) {
for (k = 0; k < MSIZE; k++) {
sum = sum + (array_a[i][k] * array_b[k][j]);
}
array_r[i][j] = sum;
}
}
* a.Каков шаг (в байтах) обращений к array_a?
b.Каков шаг (в байтах) обращений к array_b? *
Функция B
int i, j, k;
for (i = 0; i < MSIZE; i++) {
for (k = 0; k < MSIZE; k++) {
for (j = 0; j < MSIZE; j++) {
array_r[i][j] = array_r[i][j]+ (array_a[i][k] * array_b[k][j]
}
}
}
* a.Каков шаг (в байтах) обращений к array_a?
b.Каков шаг (в байтах) обращений к array_b? *
======================
Willопубликуйте мое понимание вопросов здесь:
В функции A доступ к array_a осуществляется условно (поскольку k является внутренним циклом, к массиву _a обращаются как array_a [i] [k], array_a [i] [k+1], array_a [i] [k + 2] , поэтому полученные элементы всегда находятся рядом друг с другом).array_b переходит от столбца к столбцу (потому что array_b [k] [j], array_b [k + 1] [j], array_b [k + 2] [j] ).
Поэтому ответы для функции A должны быть:
a.Каков шаг (в байтах) обращений к array_a?
Ответ: 4 байта (поскольку целое число обычно составляет 4 байта, что составляет расстояние между двумя последовательными целыми числами)
b.Каков шаг (в байтах) обращений к array_b?
Ответ: MSIZE x 4 байта (Учебник также отметил MSIZE = 500, поэтому он должен быть 2000 байтов)
В функции B доступ к array_a и array_b осуществляется по отдельности.Таким образом, их шаг составляет 4 байта.
Функция B
a.Каков шаг (в байтах) обращений к array_a?
Ответ: 4 байта
b.Каков шаг (в байтах) обращений к array_b?
Ответ: 4 байта