c++ - OOP 中面向数据的设计

标签 c++ data-oriented-design

In this slides (幻灯片 15 之后)建议使用

void updateAims(float* aimDir, const AimingData* aim, vec3 target, uint count)
{
     for(uint i = 0; i < count; i++)
     {
          aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
     }
}

因为它的缓存效率更高。

如果我有课怎么办

class Bot
{
    vec3 position;
    float mod;
    float aimDir;

    void UpdateAim(vec3 target)
    {
         aimDir = dot3(position, target) * mod;
    }
 };

 void updateBots(Bots* pBots, uint count, vec3 target)
 {
      for(uint i = 0; i < count; i++)
            pBots[i]->UpdateAim(target);
  }

我将该类的所有对象存储在一个线性数组中。

因为它们都在同一个数组中,会不会有缓存未命中? 为什么第一种方法会更好?

最佳答案

现代缓存架构通常由数据构成,每行大到足以容纳几个单词; 64 字节是典型的行大小。当您尝试读取不在缓存中的数据时,将获取整行,而不仅仅是您需要的单词。写入时,缓存中的数据如果存在则更新,但如果不存在则通常不需要获取。

在第一种情况下,对于获取的输入数据的每个缓存行,您将使用其中的每个单词。在第二种情况下,您将只使用一些结构字段;获取其他人浪费了一些带宽。

具体来说,您每次都获取 aimDir 的旧值,计算不需要它。通常,“对象”可能包含更多字段,您不希望这些字段用于此特定计算,当它们被提取到缓存中然后被忽略时会浪费更多带宽。

关于c++ - OOP 中面向数据的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141626/

相关文章:

c++ - 预编译 header 策略 - 具有来自(未知)类的继承和本地成员

c++ - 了解 std::transform 以及如何打败它

c++ - 为什么处理多个数据流比处理一个数据流慢?

面向数据设计中的接口(interface)

NAN、INF(非收敛)的 C++ std::complex<> 数据类型测试

c++ - 有一个线程拥有它运行C++的仿函数

c++ - args[0] 是否保证是执行路径?

c++编译错误building arduino project : variable not declared in this scope

data-oriented-design - 在实践中面向数据的设计?

c++ - 在 C++ 中是否有任何用于内存操作的表库/代码