例如,我有一个班级
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。
答案 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)。
这也假设您的成员已正确对齐,并且未使用任何特定的编译器功能。你当然需要知道你的内存是如何存储的,但这绝对是最优的,因为人们普遍认为算术运算的执行速度比设计处理器的速度要快。