我目前正在开发一个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
答案 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可能不适合),否则应该将指针传递给它而不是按值传递它。