Я делаю много матричной арифметики и хотел бы воспользоваться классификатором указателей C99 restrict
.
Я хотел бы настроить мои матрицы как указатели на указатели, чтобы упростить подписи, например:
int **A = malloc (ncols * sizeof(int *));
A[0] = malloc (nrows * ncols * sizof(int));
for (int i=1; i < ncols; i++) {
A[i] = A[0] + i*nrows;
}
Теперь для функции умножения матрицы
void mmultiply ( int nrows, int ncols, int **Out, int **A, int **B);
Должен ли я квалифицировать оба указателя аргументов как ограниченные? Это действительный синтаксис, но мне сложно определить, будет ли int *restrict *restrict
вести себя иначе, чем int **restrict
.
Затем, если указатели правильно ограничены, происходит доступ к элементам через A[0][col*nrows + row]
undefined? (т.е. будет ли компилятор предполагать, что я получаю доступ к матрице только через A[col][row]
для значений row
, таких, что row < nrow
)? Или я просто остаюсь последовательным?