这是否是一个好习惯?
#define MC3 (matricies + 4 * MAX_N * MAX_N) 不是个好主意。代码隐藏了一种不寻常的编码方法导致更高的维护成本。
#define MC3 (matricies + 4 * MAX_N * MAX_N)
注意一个问题 5 * MAX_N * MAX_N 。完成了 int 数学,数组索引和大小调整最好用 size_t 数学。原始代码可以溢出 MAX_N > 21000 推荐1)领先乘法 sizeof(double) 和2)使用 u 在大小常数上 #define MAX_N 1024u 3)不要做这个宏伎俩
5 * MAX_N * MAX_N
int
size_t
MAX_N > 21000
sizeof(double)
u
#define MAX_N 1024u
无论您是使用某种方式还是其他方式,主要是基于意见。 “定义”方法将节省一点内存,因为您不需要指针变量。但是,编译器可能会优化代码中的变量,因此......也许没有任何保存的东西。在我看来,“定义”方法使代码更难理解和维护,所以我不会使用定义。
该 的 重要的问题 强> 然而,使用您的代码,它不会执行您希望它执行的操作。你说你想要NxN matricies,但你的代码不允许我们这样使用它。例:
#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 是指向double的指针。使用访问数据 MA[..][..] 你需要一个不同的类型 MA 。这可能是“指向双数组的指针”。喜欢:
MA
MA[..][..]
#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 matricies。最后,IMO比原始的“定义方法”更容易阅读和理解。