Это в первую очередь основано на мнении, будете ли вы использовать тот или иной путь.Подход "define" сэкономит немного памяти, так как вам не понадобятся переменные-указатели.Тем не менее, компилятор может оптимизировать переменные из кода, так что ... возможно, в любом случае ничего не будет сохранено.По моему мнению, подход «определяет» усложняет понимание и поддержку кода, поэтому я бы не стал использовать определения.
Важная проблема в вашем коде заключается в том, что он этого не делаетчто вы говорите, вы хотите, чтобы это было сделано.Вы говорите, что хотите использовать NxN, но ваш код не позволяет нам использовать его таким образом.Пример:
#define MAX_N 1024
int main(){
double* matricies = aligned_alloc(32, 5 * MAX_N * MAX_N * sizeof(double));
double* MA = matricies;
double* MB = matricies + MAX_N * MAX_N;
MA[0][3] = 42.1; // error
MB[2][1] = 123.8; // error
printf("%f\n", MA[0][3]); // error
printf("%f\n", MB[2][1]); // error
return 0;
}
Этот код приводит к ошибкам компилятора, таким как:
main.cpp:12:10: error: subscripted value is neither array nor pointer nor vector
MA[0][3] = 42.1;
, поскольку MA
является указателем на двойное число.Для доступа к данным с помощью MA[..][..]
вам нужен другой тип для MA
.Это может быть «указатель на массив double».Например:
#define MAX_N 1024
int main(){
void* matricies = aligned_alloc(32, 5 * MAX_N * MAX_N * sizeof(double));
double (*MA)[MAX_N] = matricies;
double (*MB)[MAX_N] = MA + MAX_N;
MA[0][3] = 42.1;
MB[2][1] = 123.8;
printf("%f\n", MA[0][3]);
printf("%f\n", MB[2][1]);
return 0;
}
Этот код компилируется без ошибок, и к матрицам NxN можно получить доступ, как и следовало ожидать.Наконец, IMO также легче читать и понимать, чем ваш первоначальный подход к определению.