在C ++中,默认情况下如何安排结构的内存结构?

时间:2019-11-29 11:40:48

标签: c++ opengl optimization memory vector

如果我想在C ++中定义一个Matrix类,例如对于OpenGL渲染,我喜欢做的方式(这似乎也是最方便的)是首先定义一个Vector这样的类:

class vec3 {
    double x;
    double y;
    double z;
    [ ... ]
}

class vec4 {
    double x;
    double y;
    double z;
    double w;
    [ ... ]
}

现在,据我了解,当我创建vec {3 | 4}时,x, y, z{, w}的值应该在内存中是连续的(正确的???)。

如果我这样创建矩阵:

class mat3 {
    vec3 _m[3];
    [ ... ]
}

class mat4 {
    vec4 _m[4];
    [ ... ]
}

矩阵类 中每个向量的x, y, z{, w}的值在内存中是否会彼此相邻?如果我将第一个元素的地址提供给OpenGL,Op​​enGL会读取内存中的下一个16个值(对于4x4矩阵),它将按顺序读取矩阵的16个值,还是可以从程序中的其他位置获取其他信息的方式?

编辑(2019年11月29日):修正了错字

3 个答案:

答案 0 :(得分:1)

  

矩阵类中每个向量的x,y,z {,w}的值在内存中是否总是彼此相邻吗?

该语言可能无法保证如此,但实际上可能会是连续的。

  

它将读取矩阵的16个值

在成员中建立索引的行为在C ++中未定义。该API可能是用C编写的,可能具有不同的规则。

有一个可以迭代的数据结构,并保证有16个相邻元素:16个双精度数组。

答案 1 :(得分:0)

可靠的解决方案是从ReactDom.render( <main> <h1>Below is my component</h1> <Html_component /> </main>, document.getElementById('root') ); function Html_component(){ return( <main> <div style="border-radius: 50%; background-color: black; width: 10px; height: 10px;"></div> </main> ) }开始。对于编译器,<div id="root"></div>只是表达double[16]的偏移量的一种方法,您希望将其设为1。可以通过编写来实现相同的目的

&vec3::y

全部是内联的,因此编译器仍可以静态计算偏移量。使用y时,在运行时不会进行函数调用。

答案 2 :(得分:0)

该标准允许任意填充,因此从技术上讲,成员是否在内存中是连续定义的。我不知道有任何实现会为您的情况带来意外情况,因此您只需添加一个static_assert(sizeof(vec3) == 3 * sizeof(double));就可以了。

类似地,按照标准,未定义的行为是在代码中访问一堆成员,就好像它们是数组一样(即通过指针算术),因为那里没有实际的数组对象。现在,如果您给OpenGL这个struct并将其值放置在正确的位置,那应该没有问题(因为您的编译器大概不会触及OpenGL代码,并且OpenGL只关心字节是它们应有的大小) )。

但是请注意,对于我要说的课程范围,这只是“很好”。对于实际的生产代码,这些假设太脆弱了,应该选择更可靠(但可能不太方便)的方法。