简单的如果有任何性能降低吗?

时间:2016-06-10 22:11:37

标签: c++ performance

例如,我有一个班级

class Point
{
public:
    float operator[](int i) const
    {
       if (i == 0) return m_x; // simple ifs, performance reduction??
       if (i == 1) return m_y;
       return m_z;
    }

private:
    float m_x;
    float m_y;
    float m_z;
};

与访问std::array<float, 3>元素相比,性能是否有所降低?如果是这样,我该如何删除它。我想使用除数组之外的字段x,y,z。

3 个答案:

答案 0 :(得分:3)

  

是否有任何性能下降?

我认为你的意思是,&#34;与进行数组查找相比,&#34;。

如果是这样,答案是(可能)是 - 任何分支操作都可能导致管道停顿(如果CPU错误预测将采取哪个分支),这可能会使事情变慢。 CPU分支预测现在非常好,所以它在现实生活中可能不是问题 - 它将在很大程度上取决于调用此代码的程序的使用模式。

  

如果是这样,我该如何删除它。我想使用除x之外的字段x,y,z   一个数组。

您可以使用三项数组而不是三个单独项来删除ifs。

如果您不想将这些项目作为数组访问,您可以随时添加访问器方法,使阵列看起来像是单独的项目:

class Point 
{
public:
   [...]

   float & m_x() {return m_array[0];}
   float & m_y() {return m_array[1];}
   float & m_z() {return m_array[2];}

private:
   float m_array[3];
};

[...]

myPoint.m_x() = 5;
myPoint.m_y() = myPoint.m_x() + myPoint.m_z();
[etc]

答案 1 :(得分:1)

您可以将数据存储在数组中,而不是将数据存储为单独的成员。然后在成员的getter函数中进行数组索引。

class Point
{
public:
    float operator[](int i)
    {
       return coords[i]
    }
    float getX() {
        return coords[0];
    }
    float getY() {
        return coords[1];
    }
    float getZ() {
        return coords[2];
    }
    float setX(float val) {
        return coords[0] = val;
    }
    float setY(float val) {
        return coords[1] = val;
    }
    float setZ(float val) {
        return coords[2] = val;
    }

private:
    float coords[3];
};

答案 2 :(得分:-3)

正如其他人所说,你的语法不正确。但要回答你的问题,你可以通过以下方式解决:

float operator[](int i) {
    return *(&m_x + i);
}

运算符的地址,添加索引,并取消引用结果指针。

这比两个if语句表现更好。当然,你必须小心只提供有效的i值(从0到2)。

这也假设您的成员已正确对齐,并且未使用任何特定的编译器功能。你当然需要知道你的内存是如何存储的,但这绝对是最优的,因为人们普遍认为算术运算的执行速度比设计处理器的速度要快。