什么是更好的Matrixx4类设计c++新手

What is the better Matrix4x4 class design c++ newbie

本文关键字:c++ 新手 Matrixx4 更好 什么      更新时间:2023-10-16

使用什么方法来存储矩阵值更好?

float m1,m2,m3 ... ,m16

float[4][4].

我第一次尝试float[16],但当我调试和测试VS时,它不会显示数组内部的内容:(可以实现cout并尝试从控制台测试应用程序中读取答案

然后,我尝试在测试和调试中使用float m1、m2、m3等,这些值可以在VS中读取,因此使用起来似乎更容易。

我的问题是,因为我对c++相当陌生,什么是更好的设计?

我发现float m1,m2 ... ,m16在调试时更容易使用。

如果有人能根据经验或有基准数据说什么性能更好,我也会很高兴,我的直觉认为这并不重要,因为矩阵数据应该在内存中保持不变,对吧?

编辑:更多信息它是一个列主矩阵。据我所知,我只需要一个4x4矩阵用于视图转换管道。所以没有更大的,所以我有一些常数值。

忙于编写一个简单的软件渲染器,以此来学习更多的c++,获得更多的经验,并学习/提高我的线性代数技能。可能只会使用每个片段的着色和一些简单的照明模型,到目前为止,我已经看到4x4矩阵是我渲染所需的最大矩阵。

第2版:找到了我为什么不能读取数组数据的原因——这是我使用的浮点指针,调试菜单只显示了指针值。

感谢所有回答的人,我现在将使用Vector4m[4]答案。

您应该考虑具有float [4]成员的Vector4和具有Vector4 [4]成员的Matrix4。使用operator [],您有两个有用的类,并可以使用以下方法访问元素:[i][j]-在大多数情况下,如果不使用virtual方法,元素数据将是连续的。

您也可以通过这种方式从矢量(SIMD(指令中获益,例如在Vector4

union alignas(16) { __m128 _v; float _s[4]; }; // members
inline float & operator [] (int i) { return _s[i]; }
inline const float & operator [] (int i) const { return _s[i]; }

和在Matrix4

Vector4 _m[4]; // members
inline Vector4 & operator [] (int i) { return _m[i]; }
inline const Vector4 & operator [] (int i) const { return _m[i]; }

float m1, m2 .. m16;在使用循环迭代时变得非常难以处理。使用某种数组要容易得多。而且,最有可能的是,当您使用循环时,编译器将生成至少与"手动代码"一样高效的代码,除非您实际编写内联汇编程序或使用SSE内部函数。

只要代码不进化,16浮点解决方案就可以(维护起来很麻烦,而且可读性不强(

float[4][4]是一种更好的设计(就大小参数化而言(,但您必须理解指针的概念。

我会使用float m[16];这样的16个浮点数组,唯一的原因是使用Matrix4fv后缀函数可以很容易地将其传递给openGL这样的库。

float m[4][4];这样的2D阵列也应该在内存中与float m[16]相同地配置(请参阅我是否可以将2D阵列视为连续的1D阵列?(,并且只要具有[row][col](或[col][row],我不确定在openGL方面哪一个是正确的(索引(比较m[1][1]m[5](,使用它会更方便。

对矩阵元素使用单独的变量可能会有问题。在处理100x100这样的大矩阵时,您打算做什么?

当然,你需要使用一些类似数组的结构,我强烈建议你至少使用数组