Есть ли способ предотвратить потерю кэша при использовании одноэлементных объектов?Вот моя текущая реализация синглтона:
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.ч
#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;
}