Я нахожусь в процессе профилирования нашего приложения и обнаружил, что такие конструкции, как следующие, занимают значительное количество времени:
void Locations::remove_without_set_index(Item *item) {
locations[item->x()][item->y()][item->z()].back()->LocationIndexHandler::set_index(item->LocationIndexHandler::index());
locations[item->x()][item->y()][item->z()][item->LocationIndexHandler::index()] = locations[item->x()][item->y()][item->z()].back();
locations[item->x()][item->y()][item->z()].pop_back();
}
Так что кажется разумным подход - захватитьссылаться один раз, а затем использовать его вместо того, чтобы сделать несколько вызовов для него.Однако, когда я делаю это следующим образом:
void Locations::remove_without_set_index(Item *item) {
auto reference = locations[item->x()][item->y()][item->z()];
reference.back()->LocationIndexHandler::set_index(item->LocationIndexHandler::index());
reference[item->LocationIndexHandler::index()] = reference.back();
reference.pop_back();
}
я получаю ошибки сегментации и ошибки, такие как поврежденные списки с двойными связями.Структура данных определяется следующим образом:
std::vector<std::vector<std::vector<std::vector<Item*>>>> locations;
Итак, я предполагаю, что ссылка, которую я беру, неверна.Можно ли правильно удерживать ссылку, и если да, то как?