加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:41:53 所属栏目:百科 来源:网络整理
导读:这个问题的简短版本:指向类的第一个数据成员的指针是否会产生指向其所有数据成员的指针? 讨论: 我正在阅读一些示例代码,这很有趣.当一个特定的函数(在这种情况下是来自OpenGL的glUniformMatrix4fv C函数)作为一个参数作为一个数组时,这是以使用指向数组第
这个问题的简短版本:指向类的第一个数据成员的指针是否会产生指向其所有数据成员的指针?

讨论:

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

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

这个开发人员有一个用于创建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,modelviewMatrix.Pointer());

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

解决方法

这是C对象模型.您可以保证在相同的访问级别(私有/公共/受保护)内,对象属性按顺序排列(C 11),对于没有访问说明符的成员(在C 03中)也是如此.

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

C 11:

9.2班级成员[class.mem]

14) Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so
that later members have higher addresses within a class object. The order of allocation of non-static data
members with different access control is unspecified (11)
. Implementation alignment requirements might
cause two adjacent members not to be allocated immediately after each other; so might requirements for
space for managing virtual functions (10.3) and virtual base classes (10.1).

C 03

9.2班级成员[class.mem]

12) Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读