Что не так с циклами и массивами?
Развертывание циклов имеет недостаток: он делает код больше. Чем больше код, тем больше обращений к памяти для извлечения кода, а поскольку доступ к памяти медленный, ваш код может оказаться медленнее. Кроме того, процессор Intel предварительно обрабатывает извлеченный код и превращает его в операции ввода-вывода (микрооперации), которые затем планируются и выполняются. Процессор имеет кэш этих операций, поэтому он декодирует только те команды, которых еще нет в кэше. Таким образом, развернутый цикл будет заполнять кэш и вызывать столкновение с другим кодом. Меньший код, как правило, лучше.
Что касается массивов, я не уверен, как вы избавитесь от них.
Итак, если у вас было:
struct TextureUnit
{
// some texture unit data
}
TextureUnit units [number_of_units];
for (int i = 0 ; i < number_of_units ; ++i)
{
callfunction (units [i].someparams);
}
может быть лучше сделать:
for (TextureUnit *i = unit ; i < &unit [number_of_units] ; ++i)
{
callfunction (i->someparams);
}
но вам нужно посмотреть, что генерирует компилятор в оптимизированной сборке, чтобы убедиться, что он действительно дает какие-то преимущества.
Я думаю, что это может быть классифицировано как «микрооптимизация», поэтому я бы не стал беспокоиться об этом, если вы не докажете, что это действительно узкое место. Помните - профилируйте код, не угадывайте.