Поскольку tables
и table_count
всегда ссылаются на одни и те же объекты, вы можете получить небольшой выигрыш в производительности, убрав tables
и table_count
из списка аргументов build_tables
, сохранив их как члены временная структура, а затем делать что-то вроде этого:
struct build_tables_struct
{
build_tables_struct(std::array<std::array<entry, 8>, 255>& tables, int& table_count) :
tables(tables), table_count(table_count) {}
std::array<std::array<entry, 8>, 255>& tables;
int& table_count;
build_tables_worker(node* root)
{
...
build_tables_worker(current); // instead of build_tables(current, tables, table_count);
...
}
}
void build_tables(node* root, std::array<std::array<entry, 8>, 255>& tables, int& table_count)
{
build_tables_struct(tables, table_count).build_tables_worker(root);
}
Это применимо, конечно, только если ваш компилятор недостаточно умен, чтобы выполнить эту оптимизацию самостоятельно.
Единственный способ сделать это нерекурсивным - это управлять стеком самостоятельно. Я сомневаюсь, что это будет намного быстрее, чем рекурсивная версия.
При всем этом я сомневаюсь, что ваша проблема с производительностью здесь - это рекурсия. Передача трех ссылочных аргументов в стек и вызов функции, которую я не считаю большой нагрузкой по сравнению с работой, выполняемой вашей функцией.