В настоящее время я тестирую программу на системе Linux с помощью Valgrind. У меня есть этот странный промах кеша с методом получения const int GetID() const
, но я не могу объяснить, откуда он появился. Кто-нибудь знает, что вызывает эту проблему? Я подумал, что это может быть вызвано ключевым словом constant в конце, но оно не изменилось.
Промах в кеше происходит в L1 во время операции чтения. Я добавил снимок экрана под фрагментом кода.
class GameObject
{
friend class GameManager;
private:
int id;
GameObject();
static int CreateID() { return /* do some id stuff in here */}
...
public:
~GameObject();
const int GetID() const { return id; }
...
};
Снимок экрана KCachegrind:
ОБНОВЛЕНИЕ:
Это методы класса GameManager, которые вызывают метод const int GetID() const
. Он вызывается, когда GameObject должен быть уничтожен или возвращен в указанную c точку. GameManager содержит вектор всех GameObject, они создаются при запуске приложения, после чего вектор вообще не меняется. После создания присоединенные компоненты вызывают метод GameObject* GetGameObject(int const _gameObjectId)
один раз, чтобы получить все необходимые компоненты. Итак, я предполагаю, что GameObjects уже должны быть в кеше, или я упустил момент? Может быть, вызов настолько силен, что создает больше промахов в кэше в начале программы, чем остальная часть приложения во время выполнения?
void GameManager::DestroyGameObject(const int _id)
{
for (auto it = gameObjects.begin(); it != gameObjects.end(); it++)
{
if (it->GetID() == _id)
{
gameObjects.erase(it);
return;
}
}
}
GameObject* GameManager::GetGameObject(const int _gameObjectId)
{
for (int i = 0; i < gameObjects.size(); i++)
{
if (gameObjects[i].GetID() == _gameObjectId)
{
return &gameObjects[i];
}
}
return nullptr;
}