如果我想在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,OpenGL会读取内存中的下一个16个值(对于4x4矩阵),它将按顺序读取矩阵的16个值,还是可以从程序中的其他位置获取其他信息的方式?
编辑(2019年11月29日):修正了错字
答案 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只关心字节是它们应有的大小) )。
但是请注意,对于我要说的课程范围,这只是“很好”。对于实际的生产代码,这些假设太脆弱了,应该选择更可靠(但可能不太方便)的方法。