有沒有辦法在使用單例對象時防止緩存未命中?這是我目前單身的實現:用C++防止單例緩存錯誤
SingletonObject.h
#pragma once
class SingletonObject
{
public:
static SingletonObject* SingletonObject();
static void SingletonObject();
private:
static SingletonObject* sSingletonObject;
SingletonObject();
~SingletonObject();
};
SingletonObject.cpp
#include "SingletonObject.h"
SingletonObject* SingletonObject::sSingletonObject = NULL;
SingletonObject:: SingletonObject()
{
}
SingletonObject::~ SingletonObject()
{
}
SingletonObject* SingletonObject::GetSingleton()
{
if (sSingletonObject == NULL) // cache miss
{
sSingletonObject = new SingletonObject();
}
return sSingletonObject;
}
void SingletonObject::DestroySingleton()
{
delete sSingletonObject;
sSingletonObject = NULL;
}
有沒有更好的方式來做到這一點,以防止高速緩存未命中?這是不使用單身人士的另一個原因嗎?
更新:原來這真的是無關的緩存爲堆棧展開,並在GetSingleton()調用的條件檢查生成的代碼一樣多。通過顯式創建和銷燬單例(而不是創建需求)以及爲靜態實例創建訪問器,我可以避免大部分開銷,並指出分析過程中的顯着加速。
SingletonObject.h
#pragma once
class SingletonObject {
public:
static void CreateSingleton();
static void DestroySingleton();
static inline SingletonObject* GetSingleton() { return sInstance; }
private:
static SingletonObject* sInstance;
SingletonObject();
}
SingletonObject.cpp
#include "SingletonObject.h"
void SingletonObject::CreateSingleton() {
if (sInstance == NULL)
sInstance = new SingletonObject();`
}
void SingletonObject::DestroySingleton() {
delete(sInstance);
sInstance = NULL;
}
你在哪裏看到緩存未命中? –
@Alenxandre C.你不在'GetSingleton()'方法中看到那個註釋嗎? – Tom
@Tom:* cache miss *具有與問題無關的常見含義。這裏的問題是這個問題不清楚,他想避免什麼?在第一次調用時指針爲空?它在被銷燬之後爲空?混合條款作爲緩存未命中沒有幫助。 –