存储浮点的最佳方法

时间:2013-09-09 17:14:12

标签: c++ stl floating-point

我有一个必须存储4个浮点数的类。 将浮点数存储在数组中还是作为类的4个成员更有效?特别是与stl-containers和参数传递相结合。

7 个答案:

答案 0 :(得分:5)

不可能有任何差别。两种类结构的内存布局完全相同;因此,大多数生成的代码也将是相同的(因此,性能将是相同的)。

我可以在两个选项之间看到的唯一区别是,如果将浮点数存储为数组,则可以将其编入索引。根据您计划如何使用它们,这可能有用也可能没用。

答案 1 :(得分:4)

这有点过早优化。相反,根据其目的有意义地命名浮动。它们是四个无关的价值吗?使它们成为个人属性。它们是四个序列值吗?把它变成一个数组。如果有的话,实际表现的差异应该可以忽略不计。

答案 2 :(得分:1)

正式它取决于编译器,但速度和大小应该相同。

使用常量索引的全局数组对于编译器来说与全局变量完全相同:它们都只转换为内存中的静态地址。

使用常量索引的成员数组与成员变量完全相同:它们都转换为与this固定偏移量的地址。

g ++肯定(但很可能其他编译器也是如此)能够使用更大的寄存器将多个相邻变量的副本与单个内存操作合并。

但问题是:浮点数逻辑上是一个数组还是四个独立的值?

换句话说,您需要v[i] i是变量吗?如果你这样做,那么使用四个成员会很烦人,因为它需要一个switch,如果你从不需要它,那么使用v[0]而不是x会很烦人。

答案 3 :(得分:0)

我已经读过一些编译器倾向于有一个优化例程来内联所有固定长度的迭代< = 4.从这个角度来看,存储它们的方式并不重要。 你问“参数传递”。在这种情况下,如果你想将它们全部传递给一些例程,那么将它们全部放在固定大小的数组中会更方便。如果你把它们变成一个数组,你总是可以为整个数组和每个值添加一些getter / setter。

答案 4 :(得分:0)

您可以将浮点数存储在数组中并提供命名存取器。两全其美;)

struct Vector4f
{
    float a[4];
    float x() const { return a[0]; }
    float y() const { return a[1]; }
    float z() const { return a[2]; }
    float w() const { return a[3]; }
};

答案 5 :(得分:0)

请从C ++常见问题解答中考虑这一注意事项:Arrays Are Evil。最后一段:

  

为了解决这个问题,阵列确实是邪恶的。你可能不这么认为   你是C ++的新手。但是在你编写了大量使用的代码之后   数组(特别是如果你使你的代码防漏和   例外 - 安全),你将学习 - 艰难的方式。或者你会学到简单的   相信那些已经做过那样事情的人。该   选择是你的。

编辑:在看到@Eric的评论后,我调查并发现了这个富有洞察力的问题:Should arrays be used in C++?。这里的一些答案表明,将成员变量声明为固定大小的数组确实可以恰当地使用C ++中的数组。

一般来说,正如C ++ FAQ断言的那样,在C ++中应该谨慎使用数组。

答案 6 :(得分:-2)

据我所知,访问数组中的4个浮点数比类中声明的4个实例变量更快。

C ++编译器为数组生成的代码使用索引寻址模式,这对于intel处理器来说更容易,更快。

我很久以前就开始使用OpenGL进行3D图形处理。这些函数能够将顶点作为x,y,z值,顶点结构或具有3个成员的float数组。需要数组的函数比同类函数快。

速度还取决于你将进行何种计算。

您没有提及设计或域名,但也检查将它们存储在数组或实例变量中是否更有意义。请记住,优化的代码是以降低可读性和有时维护问题为代价的。