Mam konkretne pytanie jest to, że przy wdrażaniu singleton class W C++ jest tam żadnych zasadniczych różnic między tymi dwoma poniżej kody dotyczące wydajności, kwestii ubocznych lub coś:Heap/dynamiczne vs. statyczne przydzielanie pamięci na przykład C++ klasy Singleton
class singleton
{
// ...
static singleton& getInstance()
{
// allocating on heap
static singleton* pInstance = new singleton();
return *pInstance;
}
// ...
};
a to:
class singleton
{
// ...
static singleton& getInstance()
{
// using static variable
static singleton instance;
return instance;
}
// ...
};
(Zauważ, że w realizacji dereferencing sterty oparte nie powinny wpływać na wydajność, jak AFAIK nie ma dodatkowych maszynowego kod generowany do dereferencji. To wydaje się tylko kwestią składni odróżnić od wskaźników)
UPDATE:.
Mam ciekawe odpowiedzi i komentarze, które staram się podsumować je tutaj. (Odczytywanie szczegółowe odpowiedzi jest zalecany dla osób zainteresowanych.):
- W Singleton przy użyciu statycznego zmiennej lokalnej, destruktor klasy jest automatycznie wywoływana na zakończenie procesu, podczas gdy w dynamicznej alokacji przypadku masz w jakiś sposób zarządzać niszczeniem obiektów, np za pomocą inteligentnych wskazówek:
static singleton& getInstance() {
static std::auto_ptr<singleton> instance (new singleton());
return *instance.get();
}
Singletor stosując dynamiczną alokację jest „leniwy” niż zmiennej statycznej Singleton, jak w ostatnim przypadku wymagana pamięć dla singleton obiektu jest (zawsze ?) zarezerwowane przy uruchomieniu procesu (jako część całej pamięci wymaganej do załadowania programu) i tylko wywołanie konstruktora singleton jest odroczone do czasu wywołania
getInstance()
. Może to mieć znaczenie, gdysizeof(singleton)
jest duże.Obie są wątkowo bezpieczne w C++ 11. Ale we wcześniejszych wersjach C++ jest to specyficzne dla implementacji.
Przypadku przydzielania dynamicznego używa jednego poziomu dwukierunkowości, aby uzyskać dostęp do obiektu singleton, podczas gdy w przypadku pojedynczego obiektu statycznego singleton, adres bezpośredni obiektu jest określany i zakodowany na stałe podczas kompilacji.
P.S .: Mam poprawione terminologii ja używany w oryginalnym delegowania według odpowiedzią @ Tonyd użytkownika.
Czy porównałeś wygenerowany zestaw dla dwóch? –
Nie. Jeśli masz na myśli wygenerowany zestaw dla dwóch różnych implementacji, są one oczywiście różne, ponieważ jeden przydziela stertę, a drugi inicjuje ładowanie/wywoływanie. Jeśli masz na myśli wygenerowany zestaw do dereferencji, nie, nie porównałem. Po prostu tak. –