Skąd mam wiedzieć, czy coś jest na stosie, czy na stercie? [duplikować]

Nov 27 2020

W Rust istnieje wiele różnych typów; skąd mam wiedzieć, czy coś jest na stosie, czy na stercie?

Powiedzmy, że jeśli mam zagnieżdżone struktury o głębokości 20 poziomów, a każdy poziom zawiera dane stosu, ale na poziomie 20 jest jedno pole sterty, czy to oznacza, że ​​całe drzewo jest teraz na stercie?

A co jeśli w katalogu głównym ta struktura znajduje się wewnątrz Boxa na stercie - czy wszystkie dane ze stosu są teraz przenoszone na stertę?

Czy istnieją narzędzia do obserwowania logiki stosu i stosu?

Odpowiedzi

3 Masklinn Nov 27 2020 at 20:42

W Rust istnieje wiele różnych typów; skąd mam wiedzieć, czy coś jest na stosie, czy na stercie?

Jeśli nikt nie umieści tego na stercie, nie ma go na stercie.

Powiedzmy, że jeśli mam zagnieżdżone struktury o głębokości 20 poziomów, a każdy poziom zawiera dane stosu, ale na poziomie 20 jest jedno pole sterty, czy to oznacza, że ​​całe drzewo jest teraz na stercie?

Nie Boxjest konkretnie wskaźnikiem sterty. Więc cokolwiek jest w pudełku, jest na stercie. Reszta jest wszędzie tam, gdzie ją umieścisz (samo drzewo mogłoby znajdować się w pudełku, w którym to momencie miałbyś strukturę przydzieloną na stertę wskazującą na inną strukturę przydzieloną na stosie).

Inne wskaźniki są wspólne kupie Rc, Arc, String, lub Vec. I oczywiście są inne, bardziej skomplikowane struktury, które wykonują swoją pracę na stosie, nie będąc tak naprawdę wskazówkami, np HashMap. Przyjaciółmi.

A co jeśli w katalogu głównym ta struktura znajduje się wewnątrz Boxa na stercie - czy wszystkie dane ze stosu są teraz przenoszone na stertę?

Tak. Ponieważ reszta struktury znajduje się „wewnątrz” „korzenia”, należy opakować całość.

Czy istnieją narzędzia do obserwowania logiki stosu i stosu?

Nie całkiem. Istnieją narzędzia, takie jak śledzenie alokatorów lub obsługa debugowania w niektórych alokatorach (np. Profilowanie sterty w jemalloc), które pozwalają na śledzenie alokacji sterty. Ale wszystko to może ci powiedzieć, że została przydzielona pewna ilość bajtów, a nie jaka dokładnie te bajty, i wiesz tylko, że alokacja sterty nie nastąpiła przez dedukcję, że nie nastąpiła alokacja sterty.

2 PeterHall Nov 27 2020 at 21:07

W systemie Linux można profilować użycie sterty za pomocą valgrindi massifi wyświetlać wyniki za pomocą ms_print.

Najpierw profiluj program:

$ valgrind --tool=massif ./target/debug/my_program 
==32006== Massif, a heap profiler
==32006== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==32006== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==32006== Command: ./target/debug/my_program
==32006==

Raport zostanie zapisany do pliku o nazwie massif.out.<pid>(gdzie pidjest identyfikator procesu), który możesz przeglądać ms_print. W powyższym przykładzie identyfikator procesu to 32006, więc wyświetl go za pomocą:

$ ms_print massif.out.32006

Otrzymasz wiele informacji, ale wskażą one, gdzie występują alokacje sterty, wraz ze śladami stosu, które do nich prowadzą.