在缓存一致性方面更快/更好的是什么?第一种情况是一个结构数组,其元素一起使用(请注意,我使用了10000个元素来表示它是关于大数字。但是,确切的元素数量不是一个小修道院,因此使用动态数组):
struct physics
{
float3 position;
float3 velocity;
float3 acceleration;
float mass;
};
std::vector<physics> rigidBodies(10000);
void simulate(float dt)
{
// for each rigid body [i] calculate
// position += velocity*dt + 0.5*acceleration*dt*dt;
// force = acceleration * mass;
// note that struct members are used together.
}
第二种情况是数组结构:
struct physics
{
std::vector<float3> position(10000);
std::vector<float3> velocity(10000);
std::vector<float3> acceleration(10000);
std::vector<float> mass(10000);
};
void simulate(float dt)
{
// for each element [i] in physics calculate
// position[i] += velocity[i]*dt + 0.5*acceleration[i]*dt*dt;
// force[i] = acceleration[i]*mass[i];
}
在这两种情况下,数据都紧密打包,但在第二种情况下,每个std::vector
在不同的位置分配内存,这可能导致缓存关联性冲突未命中。但是,许多程序员(mostly in game development)建议使用第二种情况。我已经阅读了关于记忆的This excellent paper,但我还不清楚哪种方法更好。