Dlaczego nie uzywasz odsmiecacza (ang. garbage collector)?

0

W poprzedniej mojej ankiecie wyszlo, ze odsmiecacze sa niepopularne i wiekszosc woli bawic sie recznym new/delete i ryzykowac wiole... Ciekaw jestem dlaczego.

0

Np. jesli chodzi o Delphi 8 to odsmieczacz zwalnia dany obiekt gdy nie jest juz wykorzystywany. Jest to bardzo wygodna funkcja gdyz zapobiega wyciekom pamieci i zwalnia od uzywania destruktorow. Nieraz jednak uzycie destruktora staje sie konieczne - np. gdy w konstruktorze otwieramy jakis plik z prawami do zapisu zaden inny program nie moze wtedy zapisac czegos do pliku co wiaze sie z blokada owego pliku. W takich sytuacjach nie mozemy sobie pozwolic na oczekiwanie na akcje odsmieczacza - sami musimy zadbac o zwolnienie klasy, a tym samym zasobow w momencie gdy przestajemy korzystac z danego pliku.

0

Nieraz jednak uzycie destruktora staje sie konieczne - np. gdy w konstruktorze otwieramy jakis plik z prawami do zapisu zaden inny program nie moze wtedy zapisac czegos do pliku co wiaze sie z blokada owego pliku. W takich sytuacjach nie mozemy sobie pozwolic na oczekiwanie na akcje odsmieczacza - sami musimy zadbac o zwolnienie klasy, a tym samym zasobow w momencie gdy przestajemy korzystac z danego pliku.

W C++ mozna napisac odsmiecacz, ktory wywoluje destruktory. W Delphi tak sie nie dzieje? A nie ma finalizacji?

0

W C++ mozna napisac odsmiecacz, ktory wywoluje destruktory. W Delphi tak sie nie dzieje? A nie ma finalizacji?

Chodzi o to, ze chcemy miec natychmiast usuniety obiekt i zamkniety plik.
Uzywajac odsmiecacza, musimy go recznie wywolac.

Ja uzywam odsmiecacza tylko w Javie :)
Dobry programista, powinien poznac co to jest alokowanie i zwalnianie pamieci i nauczyc sie je dobrze obslugiwac, aby pozniej nie miec klopotow. Dobrze jest, jak przejedzie sie na wlasnych (najlepiej prostych) programach. Jak spedzi pol dnia szukajac bledu, to nauczy sie zwalniac pamiec :)
Oczywiscie, przy duzych projektach, nie mozna sobie juz poeksperymentowac. Wowczas odsmiecacz okazuje sie niesamowicie przydatny. Ale trzeba tez rozwazyc priorytety. Czy mozemy poswiecic troche wiecej czasu i uwagi, aby zaprogramowac porzadnie program wykorzystujac do tego standardowe mechanizmy alokowania pamieci czy moze niesamowicie nam sie spieszy i jestesmy sklonni poswiecic troche wiecej pamieci i czasu, aby uzyc odsmiecacza.
Niestety w tym drugim przypadku, gdy nam sie mocno spieszy, odsmiecacz i tak niewiele pomoze, bo usunie tylko czesc bledow, ktore zrobimy pedzac, by zdarzyc z terminami.
Jest jeszcze jeden argument przeciwko odsmiecaczom (oprocz wiekszego zuzycia pamieci i czasu). Otoz sa systuacje, w ktorych latwiej wykorzystac istniejacy destruktor niz pisac dodatkowa metode "deinit" :)

0

Czy mozemy poswiecic troche wiecej czasu i uwagi, aby zaprogramowac porzadnie program wykorzystujac do tego standardowe mechanizmy alokowania pamieci czy moze niesamowicie nam sie spieszy i jestesmy sklonni poswiecic troche wiecej pamieci i czasu, aby uzyc odsmiecacza.

Problem w tym, ze bardzo czesto w duzych projektach tak sie nie da - to "troche wiecej czasu i uwagi" sprowadza sie do nieustannego szukania wyciekow, walki z segfaultami i analizowania cudzego kodu. Pomysl co sie dzieje, jesli program pisze wiecej osob. Musieliby miec bardzo dobre linie komunikacji i bardzo dobre standardy kodowania, zeby uniknac bledow.

Jest jeszcze jeden argument przeciwko odsmiecaczom (oprocz wiekszego zuzycia pamieci i czasu). Otoz sa systuacje, w ktorych latwiej wykorzystac istniejacy destruktor niz pisac dodatkowa metode "deinit"

Sa odsmiecacze wywolujacye destruktory (te z ~) - wtedy nie jest to konieczne. Ale z tym plikiem to masz racje, wtedy trzeba przejsc na reczne zarzadzanie pamiecia, albo zrobic osobna metode.

Co do wiekszego zuzycia czasu/pamieci w odsmiecaczach, to jeszcze troche o tym powiem, ale na razie nic nie bede sugerowal, zeby nie zaklocac wynikow ankiety...

0

Problem w tym, ze bardzo czesto w duzych projektach tak sie nie da - to "troche wiecej czasu i uwagi" sprowadza sie do nieustannego szukania wyciekow, walki z segfaultami i analizowania cudzego kodu. Pomysl co sie dzieje, jesli program pisze wiecej osob. Musieliby miec bardzo dobre linie komunikacji i bardzo dobre standardy kodowania, zeby uniknac bledow.

Dlatego tez napisalem, ze nalezy rozwazyc, co jest lepsze dla projektu.

Co do wiekszego zuzycia czasu/pamieci w odsmiecaczach, to jeszcze troche o tym powiem, ale na razie nic nie bede sugerowal, zeby nie zaklocac wynikow ankiety...

Tak, pamietam posty dot. odsmiecaczy o narzucie mniejszym niz 150% ;)

0

Tak, pamietam posty dot. odsmiecaczy o narzucie mniejszym niz 150% ;)

???? 150%??? To chyba jakies "Home Made GC" albo "Reference Counting*"!!!

Na ogol odsmiecacze daja narzuty < 5-25% (jesli pracuja na systemowym alokatorze), ale mozliwe jest do uzyskania nawet znaczne przyspieszenie pracy aplikacji wzgledem odsmiecania recznego w przypadkach:

  • Odsuniecie zwalniania pamieci na czas, kiedy aplikacja czeka na reakcje uzytkownika / urzadzenia - wtedy oszczedza sie na wywolywaniu "free", ktore jest b. wolne.
  • Przesuniecie zwalniania pamieci na drugi procesor.
  • Uzycie odsmiecacza z dedykowanym alokatorem - zwiekszenie lokalnosci odwolan i zwiekszenie celnosci "cache'owania" oraz uproszczenie alokatora / dealokatora - porownaj szybkosc malloc w C i new w Javie (jesli Ci sie nie chce: Java dziala tu ponad 3 razy szybciej niz C).

J.Boehm testowal ten drugi przypadek i w niektorych programach uzyskal przyspieszenie ponad 1.5-krotne wzgledem recznego malloc/free (gdzies wygooglalem jakas jego prace naukowa, ale nie pamietam juz gdzie).

0

Tak, pamietam posty dot. odsmiecaczy o narzucie mniejszym niz 150% ;)

???? 150%??? To chyba jakies "Home Made GC" albo "Reference Counting*"!!!

To nie ja napisalem :P
http://4programmers.net/Forum/viewtopic.php?id=54031&post=138080

0

Szczerze powiedziawszy, to myślalem, że takie ustrojstwo jest tylko i wyłącznie w Javie. Nie słyszałem o tym w C/C++.

A co do samego C++, to nigdy nie użyłem malloc/free - nawet nie wiem dokładnie jak to działa [green]. A w swoich programach bardzo często zarządzam pamięcią dynamicznie. Przez new/delete.

0

Szczerze powiedziawszy, to myślalem, że takie ustrojstwo jest tylko i wyłącznie w Javie. Nie słyszałem o tym w C/C++.

W Javie jest standardowo, a do innych mozna sobie doinstalowac, o ile ktos napisal.

A co do samego C++, to nigdy nie użyłem malloc/free - nawet nie wiem dokładnie jak to działa [green]. A w swoich programach bardzo często zarządzam pamięcią dynamicznie. Przez new/delete.

W C++ nie musiales, ale w czystym C nie mialbys wyjscia :)

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