3

亲爱的 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 类的用户不会注意到它。

对此你们怎么看?

基督教

4

2 回答 2

2

好吧,尽管两者都是可移植的并且具有高性能,但它们实际上并没有相同的含义。

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

如果您的向量可以有任何(合理)数量的项目,显然您别无选择,只能使用 afloat[]或 a float*(编辑:或者,更像 C++,astd::vectorstd::array)。

于 2013-05-07T12:12:38.703 回答
0

正如已经说过的,便携是两种方式,但是像这样向成员提供访问权限并不是一个好习惯,除非您迫切需要性能。

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

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

于 2013-05-07T12:21:30.390 回答