我有一个必须存储 4 个浮点数的类。将浮点数存储在数组中还是作为类的 4 个成员更有效?特别是结合 stl-containers 和参数传递。
7 回答
不太可能有任何区别。两种类结构的内存布局将完全相同;因此,大多数生成的代码也将是相同的(因此,性能将是相同的)。
我可以看到这两个选项之间的唯一区别是,如果浮点数存储为数组,则可以对它们进行索引。根据您打算如何使用它们,这可能有用也可能没用。
这有强烈的过早优化的味道。相反,根据它们的目的有意义地命名浮动。它们是四个不相关的值吗?使它们成为单独的属性。它们是四个序列值吗?使它成为一个数组。如果有的话,实际性能差异应该可以忽略不计。
形式上它取决于编译器,但速度和大小应该相同。
用常量索引的全局数组对于编译器来说与全局变量完全相同:它们都只转换为内存中的静态地址。
以常量为索引的成员数组与成员变量完全相同:它们都转换为一个固定偏移量的地址this
。
当然,g++(但很可能其他编译器也是)能够使用更大的寄存器将多个相邻变量的副本与单个内存操作合并。
然而问题是:浮点数在逻辑上是一个数组还是四个独立值?
换句话说,您是否需要变量v[i]
在哪里?i
如果你这样做了,那么使用四个成员会很烦人,因为它需要一个switch
,如果你永远不需要它,那么使用v[0]
而不是. 会很烦人x
。
请考虑 C++ 常见问题解答中的这一警告:数组是邪恶的。最后一段:
为了解决这个问题,数组确实是邪恶的。如果您是 C++ 新手,您可能不会这么认为。但是在你编写了一大堆使用数组的代码之后(尤其是如果你让你的代码防泄漏和异常安全),你会学到——很难。或者你会通过相信那些已经做过类似事情的人来学习简单的方法。这是你的选择。
编辑:在看到@Eric 的评论后,我调查并发现了这个有见地的问题:在 C++ 中应该使用数组吗?. 那里的一些答案表明,将成员变量声明为固定大小的数组确实可以适当地使用 C++ 中的数组。
不过,一般来说,正如 C++ FAQ 所断言的,在 C++ 中应该谨慎使用数组。
您可以将浮点数存储在数组中并提供命名访问器。两全其美 ;)
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]; }
};
我在某处读到编译器倾向于有一个优化例程,它内联所有固定长度<= 4的迭代。从这个角度来看,你如何存储它们并不重要。您询问“参数传递”。在这种情况下,如果您想将它们全部一起传递给某个例程,那么将它们全部放在一个固定大小的数组中会更方便。如果将它们设为数组,则始终可以将一些 getter/setter 添加到整个数组和每个值中。
据我所知,访问数组中的 4 个浮点数比在类中声明的 4 个实例变量要快。
C++ 编译器为数组生成的代码使用索引寻址模式,这对于英特尔处理器来说更容易和更快。
很久以前,我一直在为 3D 图形开发 OpenGL。这些函数可以将顶点作为 x、y、z 值、顶点结构或具有 3 个成员的浮点数组。需要数组的函数比它们的对应函数更快。
速度还取决于您将执行哪种计算。
您没有提到太多关于设计或领域的信息,但还要检查将它们存储在数组或实例变量中是否更有意义。请记住,优化代码是以降低可读性和有时维护问题为代价的。