Vector类:4个浮点数或4个浮点数组之间的差值

时间:2013-05-07 12:05:59

标签: c++ game-engine

亲爱的StackOverflowers,

我已阅读了几本书,并看到了Vector类的不同示例。 现在我想知道: 在:

中,性能或可移植性(或除访问之外的任何其他内容)是否存在差异
class Vector
{
public:
        ....
private:
    float mTuple[4];
};

class Vector
{
public:
        ....
public:
    float x;
    float y;
    float z;
    float w;
};

我认为Vector.x是一个更优雅的解决方案,然后是Vector.X(); 我知道重载操作符[]会更复杂一点, 但我认为编译器应该能够轻松地将其优化到相同的速度, 它不会被Vector类的用户注意到。

你们对此有何看法?

基督教

2 个答案:

答案 0 :(得分:2)

嗯,尽管两者都具有可移植性和高效性,但它们实际上并没有相同的含义。

如果你知道你的数组中总会有4个元素并且它们具有不同的语义(例如,3D空间中的坐标x,y和z),那么你的第二个解决方案可能更好,尽管允许公众访问字段不是很好的做法(并且不再具有高性能,因为你的编译器可以内联烦扰琐碎的getter和setter)。

如果您的向量可以包含任何(合理)数量的项目,显然您别无选择,只能使用float[]float*(编辑:或更多C ++ - 类似,{{1 }或std::vector)。

答案 1 :(得分:0)

正如已经说过的那样,便携式是两种方式,但是除非你急需性能,否则给这样的成员提供访问并不是一种好的做法。

但是,访问数组时,编译器会加载基指针并添加值以访问它。在另一种情况下,使用getter,编译器直接生成代码以访问变量的地址。

因此,访问数组时,至少需要两条指令,而在另一种情况下,只需要一条指令。不确定这是否真的得到了优化。我不会赌它,如果你的生活依赖于它,你应该确保代码完成你想要的,而不是依赖于编译器的输出。