C数组vs结构

时间:2017-03-26 21:52:03

标签: c arrays performance opengl struct

我目前正在开发一个OpenGL应用程序。到目前为止,在编程API时一切运行良好。

对于通常的数据类型,我使用结构。例如:

struct vec3 {
 GLfloat x;
 GLfloat y;
 GLfloat z;
}

但是现在我考虑使用与简单数组相同的数据类型,例如

typedef GLfloat vec3[3];

我真的喜欢将类型作为简单数组处理,因为它更容易访问它们,我甚至可以使用循环来修改它们的值(例如在GLfloat矩阵[16]中) 然而,让我烦恼的是C不允许返回数组,所以我必须自己提供存储操作     mat4_identity(mat4输出) 我可以轻松地说出结构

mat4 m = mat4_identity() clean and nicely.

我现在的问题是:哪一个更好的性能(当然,例如当有很多verticies时,我只能想到重型结构指针解引用+ acesses)以及我最终应该使用哪一个我的OpenGL API

1 个答案:

答案 0 :(得分:3)

如果您使用的是C11,那么您可以充分利用这两个世界!

union vec3 {
        struct {
            float x, y, z;
        };
        float xyz[3];
};

然后您可以通过以下方式访问它们:

printf("%f %f %f\n", vec.x, vec.y, vec.z);
printf("%f %f %f\n", vec.xyz[0], vec.xyz[1], vec.xyz[2]);

如果您不使用C11,您仍然可以执行此操作,但必须将包含三个组件的结构命名为:

union vec3 {
    struct {
        float x, y, z;
    } components;
    float xyz[3];
}

至于效率,数组保证是连续的(元素之间没有间隙),而结构不是,所以可能是结构浪费了更多的内存。但考虑到现代计算机具有的内存量,我怀疑这是一个问题。

另请注意,当数组衰减为指针时,结构不能保证这样做。除非结构适合寄存器(vec3可能不适合),否则应该将指针传递给它而不是按值传递它。