0

我目前正在使用 Valgrind 在 Linux 系统上对程序进行基准测试。我用 getter 方法遇到了这个奇怪的缓存缺失const int GetID() const,但我无法真正解释它的来源。有谁知道是什么导致了这个问题?我认为这可能是由最后的常量关键字引起的,但它并没有改变。

在读取操作期间,缓存未命中发生在 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方法。当必须销毁游戏对象或将其返回到特定点时调用它。GameManager 包含所有 GameObjects 的向量,它们是在应用程序启动时创建的,之后该向量根本不会改变。创建后,附加组件调用该GameObject* GetGameObject(int const _gameObjectId)方法一次以检索所有必需的组件。所以我猜游戏对象应该已经在缓存中或者我错过了一点?也许调用是如此强大以至于它在程序开始时比运行时应用程序的其余部分创建更多的缓存未命中?

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;
}
4

0 回答 0