Tworzenie zmiennych dynamicznie a statycznie w metodzie klasy

0

Witam. Czy jest jakaś różnica jeśli chodzi o pamięć/szybkość w działaniu pomiędzy tymi dwoma metodami. Jak rozumiem, w obydwu przypadkach pamięć będzie zwolniona zaraz po zakończeniu tej funkcji, wiec czy jest tu jakakolwiek różnica? Mówimy oczywiście o sytuacji gdy nie przekazujemy dalej takiej zmiennej/wskaźnika do niej.

void Klasa::metoda(){
int a;
TUTAJ RESZTA KODU
}
void Klasa::metoda(){
std::unique_ptr<int> a{new int};
TUTAJ RESZTA KODU
}
2

Jak nie potrzebujesz wskaźnika, to po co tworzyć (inteligentny) wskaźnik?

1
xDevil2 napisał(a):

Witam. Czy jest jakaś różnica jeśli chodzi o pamięć/szybkość w działaniu pomiędzy tymi dwoma metodami. Jak rozumiem, w obydwu przypadkach pamięć będzie zwolniona zaraz po zakończeniu tej funkcji, wiec czy jest tu jakakolwiek różnica? Mówimy oczywiście o sytuacji gdy nie przekazujemy dalej takiej zmiennej/wskaźnika do niej.

void Klasa::metoda(){
int a;
TUTAJ RESZTA KODU
}
void Klasa::metoda(){
std::unique_ptr<int> a{new int};
TUTAJ RESZTA KODU
}

Int to bardzo kiepski przykład. Int na pewno będzie szybszy na stosie ;)

Jeden obiekt utworzy się na stosie, drugi na stercie. Z niskopoziomowego punktu widzenia są pewne różnice.

Tworzenie zmiennych na stosie jest szybkie, bo wymaga jedynie przesunięcia licznika stosu i w przypadku c++ wywołania konstruktora. Tworząc zmienna na stercie dodatkowo musisz wejść w alokator pamięci, który trzyma informacje o dostępnej pamięci; w przypadku braku miejsca na obiekt o danym rozmiarze skorzysta z ABI systemu i poprosi o przydzielnie dodatkowej pamięci wchodząc tym samym do jądra systemu.

Dodatkowo zmienne na stosie mogą być od razu w cachu (bo zapewne odwoływałeś się do innych rejonów na stosie, choćby do swojego activation recordu, więc pamięć na około została już sprowadzona z pamięci do cachu). Pamięć ze ze sterty prawdopodobnie zostanie sprowadzona do cache dopiero po pierwszym odwołaniu do pamięci w tym rejonie.

Ale jeżeli miałbyś obiekt, który jest bardzo duży (i nie alokuje nic) to możesz nie chcieć tworzyć go na stosie ze względu na miejsce, które by tam zajął. Ten sam stos jest używania do trzymania activation records (ramek funkcji) i zmiennych lokalnych. A przecież stos ma ograniczoną pojemność (zazwyczaj wystarczająco dużą). A co jeżeli samemu alokujesz (niedużą) pamięć na stos i przekazujesz ją podczas tworzenia nowych wątków (takie rzeczy jak najbardziej są robione, ale bardziej w programowaniu systemowym w c, niż w c++)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1