2011-02-08 17 views

Odpowiedz

10

Słaba tablica to zbiór słabych wskaźników. Słaby wskaźnik jest odwołaniem do wartości, która może być zbiorem śmieci.

Jeśli użyjesz zwykłego wskaźnika na wartości, zapobiegniesz jego zbieraniu śmieci, dopóki sam sędzia nie zostanie zebrany. W przypadku słabego odniesienia wartość może zostać zebrana przed sędzią.

Przykład użycia to źródło, które przesyła dane do wielu zlewów. Jeśli źródło zawiera regularne wskaźniki do zlewów, ilekroć zlew nie jest już potrzebny, nie będzie zbierane śmieci aż do źródła (co może na przykład nigdy się nie wydarzyć). Jeśli źródło używa słabych odniesień do zlewów, dane zlewozmywaki mogą być śmieciami zebranymi przed źródłem.

Innym przykładem jest hashconsing dla typu, który używa słabych hashtables (które zawierają słabe tablice). Szybko, hashconsing to sposób na zapamiętanie wszystkich wartości danego typu, które są tworzone i żyją w programie. Wraz z odpowiednim konstruktorem wartości może to zapewnić maksymalne dzielenie wartości tego typu i umożliwia implementację równości strukturalnej na tym typie jako fizycznej równości. W takim przypadku, jeśli użyto nie słabego hashtable, wartości, które nie będą już używane przez program, nigdy nie zostaną zebrane.

Wreszcie, wiele osób uważa (niesłusznie), że słabe referencje są przydatne do wdrożenia pamięci podręcznych. Zachowaj słabe odniesienie do wartości, jeśli zostały zebrane śmieci, przeładuj/ponownie oblicz wartość. Nie jest to dobry algorytm pamięci podręcznej, ponieważ główne usuwanie śmieci odzyskuje wszelkie wartości, które nie są już przywoływane. Więc twój algorytm buforowania nie ma przewidywalności ani użytecznej właściwości, jak na przykład rozmiar pamięci podręcznej/dostępnej pamięci nie przekracza danego stosunku.

+0

Bardzo ładna odpowiedź, dzięki! – Yttrill

1

Użyj pary funkcji dwuliterowych pomiędzy strukturą danych a strukturalnie zgodną reprezentacją zgodną z modułem Marshall.

+0

Nie mogę dać ci tyknięcia, James, chociaż chciałbym. Zobacz następny .. – Yttrill

+0

Problem jest to tabela symboli dla schematu OCS, oczywistą rzeczą do zapisania jest s-wyrażenie przed kompilacją. Problem polega na tym, że "save" jest częścią Dypgen, oszczędzając automat, i nie mogę łatwo odłączyć skompilowanego schematu od automatu. – Yttrill

+0

Właściwie mógłbym to zrobić przez przypisanie każdej akcji Parsera jako liczby całkowitej, zapisz ją i osobno zapisz s-wyrażenia przed kompilacją. Ale mam problem: jak uniknąć ponownej kompilacji kodu programu przy każdej redukcji produkcji? – Yttrill

Powiązane problemy