有没有办法在使用单例对象时防止缓存未命中?这是我目前单身的实现:用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 *具有与问题无关的常见含义。这里的问题是这个问题不清楚,他想避免什么?在第一次调用时指针为空?它在被销毁之后为空?混合条款作为缓存未命中没有帮助。 –