Простой константный геттер создает промах в кеше? (C ++) - PullRequest
0 голосов
/ 30 мая 2020

В настоящее время я тестирую программу на системе 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:

enter image description here

ОБНОВЛЕНИЕ:

Это методы класса 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;
}
...