类将数据成员存储在顺序存储器中?

时间:2013-01-16 06:16:02

标签: c++ opengl pointers opengl-es

这个问题的简短版本:指向类的第一个数据成员的指针是否会产生指向其所有数据成员的指针?

讨论:

我正在阅读一些示例代码,这很有趣。当一个特定的函数(在这种情况下,来自OpenGL的glUniformMatrix4fv C函数)作为一个参数作为一个数组时,这将以通用的C方式传递,使用指向数组第一个元素的地址的指针,如下所示:

glUniformMatrix4fv(glvariable, 1, 0, &newmatrix[0]); //指的是newmatrix

这个开发人员有一个C ++类,用于创建一个4X4矩阵,总共16个浮点数。但是,该类的数据成员被分为4个独立的向量,每个向量包含4个数据成员:

以下是该类的数据成员:

vec4 x;
vec4 y;
vec4 z;
vec4 w;

vec4类依次提供这些数据成员:

T x;
T y;
T z;
T w;
然后,他创建了一个指向第一个vec4 x数据成员的函数:

    const T* Pointer() const
{
    return &x.x;
}

不知何故,这奇迹般地转化为发送所有4个vec4对象及其各自的4个组成部分:

glUniformMatrix4fv(modelviewUniform, 1, 0, modelviewMatrix.Pointer());

我对C ++很新,但这让我感到惊讶,你可以指向一个数据成员,并期望所有其他成员也被发送。是因为类按特定顺序定义它们吗?如果在类定义中以不同的顺序定义它们会怎样?

1 个答案:

答案 0 :(得分:8)

这是C ++对象模型。您可以保证在相同的访问级别(private / public / protected)内,对象属性按顺序排列(C ++ 11),对于没有访问权限的成员也是如此它们之间的说明符(在C ++ 03中)。

这并不意味着你所做的是一个好主意。最好避免演员表,只是让函数做更多的工作。

C ++ 11:

9.2班级成员[class.mem]

  

14)分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员   后来的成员在类对象中有更高的地址。非静态数据的分配顺序   具有不同访问控制的成员未指定(11)。实施对齐要求可能   导致两个相邻成员不能立即分配;可能要求   管理虚函数(10.3)和虚基类(10.1)的空间。

C ++ 03

9.2班级成员[class.mem]

  

12)在没有干预访问说明符的情况下声明的(非联合)类的非静态数据成员被分配   后来的成员在类对象中有更高的地址。非静态数据的分配顺序   由访问说明符分隔的成员未指定(11.1)。实施对齐要求可能   导致两个相邻成员不能立即分配;可能要求   管理虚函数(10.3)和虚基类(10.1)的空间。