3

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

讨论:

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

glUniformMatrix4fv(glvariable, 1, 0, &newmatrix[0]); // 引用新矩阵

该开发人员有一个用于创建 4X4 矩阵的 C++ 类,总共有 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++ 还很陌生,但这让我感到惊讶,您可以只指向一个数据成员并期望所有其他数据成员也能发送。是因为该类以特定顺序定义它们吗?如果它们在类定义中以不同的顺序定义怎么办?

4

1 回答 1

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) 的空间要求也是如此。

于 2013-01-16T06:18:44.280 回答