我正在设计数学库。我想从简单的向量4和矩阵4x4开始,我将根据需要扩展它。我试图通过我见过的几个设计的赞成和弊端,以便我可以选择。我觉得很沮丧,我搜索了很多,我找到了很多,但几乎没有答案谈论设计的效率,这对数学图书馆至关重要。
我正在考虑的是,编译器是惊人的现在我知道我不能更聪明的编译器,但我想帮助他最大化。 C ++ 11带来了很好的东西,比如移动语义和其他东西,比如std :: tuple ....
据我所知,数据应存储在连续存储器中。
我有点失落,需要更多信息:
A)数据应该是: value_type [Rows * Cols](简单c数组)或 value_type *(在大小Rows * Cols的堆上分配)或使用类似的东西 的std ::元组
B)还有继承或组合/聚合 我可以拥有数据的模板基类,或者我可以使用合成/聚合
C)我看到了3个数据布局
D)同样在gamasutra文章中(看起来很旧,编译器现在更好)他说该类不应该有运算符重载,而应该使用全局函数。例如,crossProduct函数使其成为非成员而不是成员函数。
我有所有这些问题,我知道有很多。你对这些有什么看法,特别是在A和C上。
编辑:
感谢所有关于A点的回答,我必须说,目前我最大的问题是C点,对不起我知道不清楚。点c实际上是关于类的设计。我看到了2个选项(如果你考虑这个静态技巧http://www.gamedev.net/topic/261920-a-slick-trick-in-c/就有三种选择)我可以拥有一个Vector4,例如我可以让x,y,z和w的成员公开,或者我也可以与那些成员和一个数组,或者我只能有一个数组,并且具有访问者的函数X(),Y(),Z(),W()。最后有一个静态技巧,我提供了上面的链接,但我更喜欢x,y,z和w是静态的,数组将是数据成员。
答案 0 :(得分:1)
对于一个小的4x4矩阵,我会避免在堆上动态分配内存...一个简单的一维数组,你可以作为一个二维数组索引就足够了(即,有序对(x,y)值会be matrix_array[COLUMNS * y + x]
),特别是考虑到加载数组中的任何单个值也会导致相邻值存储在处理器的缓存行中,从而加快对任何相邻元素的访问。缓存加载也可以在堆分配的内存中发生,但是如果可能的话,对于小型基质,避免堆分配的主要原因是许多顺序数学运算需要你返回一个临时的,没有r值的引用,你'在快速分配堆栈中的内存时,最终会在那些临时文件的副本构造函数内对new
和delete
进行大量调用,这会大大减慢速度。
其次,我建议你采用模板化方法,因为这样可以让你定义矩阵,不仅可以用于double
等普通旧数据类型,还可以用于任何辅助复合类型您可能决定稍后定义,或从其他库中导入,例如有理数,复数等。无论您决定添加运算符重载都取决于您......有些人不喜欢它,因为它“隐藏”了复杂性在幕后可能发生的事情(即A * B
的{{1}}比4 {4 doubles
的{{1}}要简单得多。另一方面,它可以大大简化您为复杂数学运算编写的代码量。
答案 1 :(得分:1)