我想实现(抽象表示)二维4x4矩阵。我为矩阵乘法等编写的所有代码都将完全“展开”,也就是说,我不会使用循环来访问和写入矩阵中的数据条目。
我的问题是:在C语言中,使用这样的结构会更快吗:
typedef struct {
double e0, e1, e2, e3, e4, ..., e15
} My4x4Matrix;
还是会更快:
typedef double My4x4Matrix[16];
鉴于我将这样分别访问每个矩阵元素:
My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c.e0=a.e0+b.e0;
c.e1=a.e1+b.e1;
...
或者
My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c[0]=a[0]+b[0];
c[1]=a[1]+b[1];
...
还是它们的速度完全相同?
最佳答案
任何体面的编译器都会逐字节生成完全相同的代码。但是,使用数组可以为您带来更大的灵活性。访问矩阵元素时,可以选择是访问固定位置还是使用变量访问地址位置。
我也强烈质疑您选择手动“展开”(展开?)所有操作。任何优秀的编译器都可以为您完全以恒定的迭代次数展开循环,甚至可以生成SIMD代码和/或优化调度指令的顺序。您将很难手工做得更好,最终您将获得难以读懂的代码。您问这个问题的事实向我表明,您甚至没有一个天真的优化编译器就没有足够的经验来做得更好。
关于c - 什么是C : structs or arrays?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4560142/