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