【发布时间】:2017-03-26 21:52:02
【问题描述】:
我目前正在开发一个 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.
我现在的问题是:哪一个在性能方面更好(当然,例如,当有很多顶点时,我只能想到繁重的结构指针取消引用 + 访问)以及我最终应该为我的 OpenGL API 实际使用哪一个.
【问题讨论】:
-
你考虑过
struct vec3 { GLfloat vec3[3]; }吗? -
@chux 是的,但这对我来说更像是一个奇怪的黑客/解决方法。理想的情况是我可以使用结构但像数组一样访问它们(显然,当它们都由具有相同数据类型的变量组成时)。不幸的是,这也不起作用,因为我听说结构内部有特殊的对齐或包装。
-
struct vec3 { union { struct { float x, y, z; }; float a[3]; }; -
@Joe 你忘了大括号:|此外,sizeof(struct xyz) 不必等于 sizeof(array),因此对结构的写入不会映射到数组。
-
是的,我确实忘记了一个,但原理很清楚。编译器没有理由布局只有一种类型的结构与相同类型的数组不同。在任何普通编译器上,这成为问题的可能性非常非常低。
标签: c arrays performance opengl struct