C:结构或数组的速度更快?

Col*_*lin 4 c arrays performance struct

我想实现(代表抽象的)二维4x4矩阵.我为矩阵乘法等编写的所有代码都将完全"展开" - 也就是说,我不会使用循环来访问和写入矩阵中的数据条目.

我的问题是:在C中,使用结构本身会更快:

typedef struct {
    double e0, e1, e2, e3, e4, ..., e15
} My4x4Matrix;
Run Code Online (Sandbox Code Playgroud)

或者这会更快:

typedef double My4x4Matrix[16];
Run Code Online (Sandbox Code Playgroud)

鉴于我将单独访问每个矩阵元素:

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c.e0=a.e0+b.e0;
c.e1=a.e1+b.e1;
...
Run Code Online (Sandbox Code Playgroud)

要么

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c[0]=a[0]+b[0];
c[1]=a[1]+b[1];
...
Run Code Online (Sandbox Code Playgroud)

或者它们的速度完全相同?

R..*_*R.. 15

任何体面的编译器都会生成完全相同的代码,逐字节.但是,使用数组可以让您获得更大的灵活性; 访问矩阵元素时,您可以选择是要访问固定位置还是使用变量寻址位置.

我也高度质疑你选择"放松"(展开?)所有操作.任何好的编译器都可以为您完全展开具有恒定迭代次数的循环,甚至可以生成SIMD代码和/或最佳地调度指令的顺序.你将很难用手做得更好,而你最终会得到令人难以理解的代码.您提出这个问题的事实向我表明,即使是一个天真的优化编译器,您可能没有足够的经验来做得更好.


AnT*_*AnT 9

结构元素(字段)只能通过在程序源中明确指定的名称来访问,这意味着每次访问字段时,必须在编译时选择实际字段并进行硬编码.如果你想用数组实现相同的东西,那就意味着你将使用显式的常量编译时数组索引(如你的例子中所示).在这种情况下,两者的性能将完全相同,生成的代码将完全相同(不考虑"恶意"编译器).

但是,请注意,数组为您提供了额外的自由度:如有必要,您可以通过运行时索引选择数组元素.这是结构不可能实现的.只有你知道这对你是否重要.

另一方面,请注意C中的数组不可复制,这意味着您将被迫使用memcpy来复制基于数组的数组My4x4Matrix.使用基于结构的版本,正常的语言级复制将起作用.对于数组,可以通过将实际数组包装在结构中来解决此问题.

  • 您可以将数组放在结构中,然后直接将其复制,但也具有数组的所有优点. (2认同)