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

joh*_*ers 3 c++ opengl pointers opengl-es

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

讨论:

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

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

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

以下是该类的数据成员:

vec4 x;
vec4 y;
vec4 z;
vec4 w;
Run Code Online (Sandbox Code Playgroud)

vec4又类提供这些数据成员:

T x;
T y;
T z;
T w;
Run Code Online (Sandbox Code Playgroud)

然后他创建一个函数来指向第一个vec4 x数据成员:

    const T* Pointer() const
{
    return &x.x;
}
Run Code Online (Sandbox Code Playgroud)

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

glUniformMatrix4fv(modelviewUniform, 1, 0, modelviewMatrix.Pointer());
Run Code Online (Sandbox Code Playgroud)

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

Luc*_*ore 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).

  • -1:此保证仅在*C++ 11中出现*.C++ 98/03没有这样的承诺,除非它是POD类型. (2认同)