Почему операция с итерацией вперед выполняется быстрее чем в обратную сторону?
Я пишу что то вроде клеточного автомата с симуляцией эволюции. В моем коде есть функция move, которая двигает клетки по полю.
int clamp(int a)
{
if (a > 1199) return 1199;
if (a < 0) return 0;
else return a;
}
void move(shared_ptr<Cell>(&Cells)[1200][1200], int direction)
{
if (energy >= 10)
{
int offset_x = 0;
int offset_y = 0;
if (direction == 0) { offset_x = -1; }
if (direction == 2) { offset_x = 1; }
if (direction == 3) { offset_y = -1; }
if (direction == 1) { offset_y = 1; }
if (Cells[clamp(pos[0] + offset_x)][clamp(pos[1] + offset_y)] -> age == -1)
{
Cells[clamp(pos[0] + offset_x)][clamp(pos[1] + offset_y)] = Cells[clamp(pos[0])][clamp(pos[1])];
Cells[clamp(pos[0])][clamp(pos[1])] = make_shared<Cell>(0, pos[0], pos[1]);
pos[0] = clamp(pos[0] + offset_x);
pos[1] = clamp(pos[1] + offset_y);
energy -= 10;
}
}
}
В качестве аргумента direction_index выступает сгенерированная неким подобием нейронки цифра от 0 до 3 включительно. В ситуациях, где на вход функции подаются цифры 0 и 3, то есть где хоть одно из значений смещения по столбцам и рядам двумерного массива становится отрицательным, программа выполняется в десятки раз медленнене чем в случае движения вперед по списку с клетками. С чем это может быть связано?