Производительность кеширования векторов, матриц и кватернионов

В прошлом я неоднократно замечал, что код 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%). Понятия не имею, но, по крайней мере, теперь я знаю, что исходный подход был быстрее.

5
задан Engineer 7 November 2011 в 20:43
поделиться