c++ - vector 、矩阵和四元数的缓存性能

标签 c++ c arrays optimization data-structures

我在过去的许多场合都注意到,C 和 C++ 代码对这些结构使用以下格式:

class Vector3
{
    float components[3];
    //etc.
}

class Matrix4x4
{
    float components[16];
    //etc.
}

class Quaternion
{
    float components[4];
    //etc.
}

我的问题是,这会导致比说这样更好的缓存性能吗?

class Quaternion
{
    float x;
    float y;
    float z;
    //etc.
}

...因为我假设类成员和函数位于连续的内存空间中,无论如何?我目前使用后一种形式,因为我觉得它更方便(但是我也可以看到数组形式的实际意义,因为它允许根据正在执行的操作将轴视为任意轴)。


在听取了受访者的一些建议后,我测试了差异,实际上阵列速度较慢——我得到大约 3% 的帧率差异。我实现了 operator[] 来将数组访问包装在 Vector3 中。不确定这是否与它有任何关系,但我对此表示怀疑,因为无论如何都应该内联。我能看到的唯一因素是我不能再在 Vector3(x, y, z) 上使用构造函数初始化列表。然而,当我使用原始版本并将其更改为不再使用构造函数初始化列表时,它的运行速度比以前慢了很多(小于 0.05%)。没有线索,但至少现在我知道原来的方法更快。

最佳答案

这些声明在内存布局方面并不等同。

class Quaternion
{
    float components[4];
    //etc.
}

以上内容保证了元素在内存中是连续的,而如果它们像上一个示例中那样是单独的成员,则允许编译器在它们之间插入填充(例如将成员与某些地址模式对齐)。

这是否会导致更好或更差的性能主要取决于您的编译器,因此您必须对其进行分析。

关于c++ - vector 、矩阵和四元数的缓存性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8037780/

相关文章:

javascript - 在 React useState Hook 中删除数组的第一个元素?

php - 将 PHP 数组转换为单个变量

c++ - 奇怪的编译器错误 : "undefined reference to ' main'"

java - c++ 插件 -> JNI -> Java 类路径

c - 使用 MPI_File_read_at 时出现段错误

c++ - 开发人员无法执行 .exe 错误 193 : %1 not a valid win32 application

c - 在 for 循环中使用 getch() 的重要性

c# - 如何在不使 header 信息无效的情况下通过网络传输发送对象

c++ - 在 Qt 中显示窗口而不窃取焦点

c - C 中的 float_fast(类似于 stdint.h 中的 int_fast)