例如,我有一个班级
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.
最佳答案
Is there any performance reduction?
我假设你的意思是“与进行数组查找相比”.
如果是这样,答案是(可能)是 – 任何分支操作都可能导致管道停滞(如果CPU错误预测将采取哪个分支),这可能会使事情变慢. CPU分支预测现在相当不错,所以它在现实生活中可能不是问题 – 它将在很大程度上取决于调用此代码的程序的使用模式.
If so, how can I remove it. I want to use fields x, y, z other than
an array.
您可以使用三项数组而不是三个单独的项来删除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]