Nbsp; SOA (Simple Offset Assignment)
Допустим, имеется последовательность доступов к переменным (a, b, c, d – имена переменных):
b c a d b c a d
Обозначим через & - операцию вычисления адреса, A – операцию доступа, I – индексный регистр, ++ или -- операцию пост изменения индексного регистра.
В общем случае каждое обращение к переменной имеет вид:
I = &var
A(I)
т.е. для каждого обращения необходимо произвести две операции. Допустим теперь, что эти переменные в памяти были расположены в лексикографическом порядке, т.е:
a b c d
Для работы с рассмотренной выше последовательностью обращений, будет необходимо произвести следующие операции:
I=&b
A(I++)
A(I)
I=&a
A(I)
I=d
A(I)
I=&b
A(I++)
A(I)
I=&a
A(I)
I=d
A(I)
В итоге, для работы с данной последовательностью обращений при имеющемся расположении переменных в памяти нам необходимо затратить 14 операций. Допустим теперь, что мы разложили упомянутые выше переменные следующим образом:
b c a d
Теперь последовательность операций будет выглядеть так:
I(&b)
A(I++)
A(I++)
A(I++)
A(I)
I(&b)
A(I++)
A(I++)
A(I++)
A(I)
Всего мы затратили 10 операций. Таким образом, правильное распределение в памяти может дать существенную экономию на операциях загрузки адреса при использовании возможностей автоувеличения или автоуменьшения.
Для вычисления оптимального расположения переменных в памяти используются различные эвристики (эвристики для решения задачи SOA).