gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:34 26 4
gpt4 key购买 nike

我在过去的许多场合都注意到,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com