Zaletą odśmiecania jest to, że symuluje maszynę z nieskończoną ilością pamięci. Mechanizm lub implementacja tej abstrakcji ma być całkowicie przejrzysta dla ciebie jako programisty. Wszyscy wiemy, że mechanizm odzyskuje pamięć, która nie jest już używana przez program, ale nie jest to w rzeczywistości zagwarantowane. Jeśli uruchomisz program na maszynie z większą ilością pamięci RAM, niż program faktycznie używa, odebranie pamięci może nigdy nie nastąpić. Ponownie, nie ma znaczenia, ponieważ możesz po prostu napisać program bez względu na to, jak wykorzystuje pamięć. Menedżer pamięci po prostu przydzieli więcej pamięci RAM za każdym razem, gdy program tego zażąda, i możesz założyć, że takie przydzielanie zawsze się powiedzie. Java jest językiem wyrzucania elementów bezużytecznych, a C ++ nie. 1
Wadą wyrzucania elementów bezużytecznych jest to, że podobnie jak wszystkie abstrakcje , jest nieszczelny. Nie zawsze działa idealnie przez cały czas, szczególnie w skrajnych przypadkach, i prawdopodobnie napotkasz błędy. Ludzie, którzy napisali algorytm wyrzucania elementów bezużytecznych (ten, który powinien być dla ciebie przejrzysty jako programista) zoptymalizowany pod kątem najczęstszych przypadków, a problem ze zwykłymi przypadkami polega na tym, że nigdy nie są tak powszechne. Ogólnie rzecz biorąc , nie można zrobić nic lepszego niż śmieciarz w zarządzaniu pamięcią. Ale w szczególnych okolicznościach (i przy wystarczającej ilości czasu, energii i zrozumienia) może to być możliwe. C ++ zapewnia tę elastyczność; Java nie.
Wszystko to powiedziawszy, myślę, że tutaj obowiązują standardowe porady dotyczące wyboru języka, być może nawet bardziej w tym przypadku, biorąc pod uwagę ograniczenia. Wybierz język, który jest najbardziej znany głównym twórcom projektu. Oprócz oczywistych przyczyn (takich jak możliwość szybszego i bardziej wydajnego tworzenia aplikacji), jest to szczególnie ważneważne w przypadku, który opisujesz, ponieważ programowanie w C ++ tak jak programujesz w Javie spowoduje strasznie nieskuteczne praktyki zarządzania pamięcią, a zatem spowoduje wycieki i awarie. Analogicznie, programowanie w Javie, tak jak programujesz w C ++, nie przyniesie ci wiele dobrego i może skończyć się produkcją mniej niż zoptymalizowanego programu, biorąc pod uwagę, że algorytmy wyrzucania elementów bezużytecznych są modyfikowane i dostosowywane do najczęstszych przypadków .
Programiści, którzy są przyzwyczajeni do pracy w językach zbieranych przez śmieci, uczą się ufać modułowi odśmiecającemu, zamiast z nim walczyć. Jeśli pracujesz w języku zbierającym śmieci, są to programiści, których potrzebujesz w swoim projekcie. Programiści, którzy nie sąprzyzwyczajeni do pracy w języku zbierającym śmieci są z natury sceptyczni wobec takiej „nieskończonej pamięci” abstrakcji i często mają wiele dobrych powodów. Choć ci programiści mogą być dobrzy, nie są to osoby, które nie chcą pracować w języku zbierającym śmieci, ponieważ będą walczyć z GC na każdym kroku, nieustannie go zgadując i często wytwarzając wolniejsze, mniej wydajne pamięci kod niż inny typ programatora. W najlepszym razie po prostu spędzą dużo czasu na nowo opracowując koło, co kosztuje dużo pieniędzy, a nawet więcej w związku z długoterminowymi kosztami utrzymania.
A potem musisz również zadać sobie pytanie, czy to naprawdę ma znaczenie. W złośliwym komentarzu Bo jest coś więcej niż tylko odrobina prawdy: pamięć jest teraz tak tania, że nie jest warta zbytniego wysiłku. Nawet jeśli potrzebujesz ogromnych kwot, kwoty te nie są już tak ogromne jak 10 lat temu. Programiści i tworzenie aplikacji są znacznie droższe niż kupowanie pamięci RAM i mocy obliczeniowej. Nie oznacza to, że powinieneś unikać ekonomii tam, gdzie to możliwe, ale oznacza to również, że nie powinieneś tracić zbyt wiele czasu na robienie tego.
1 Oczywiście założenie to podkreśla głębszą wadę tego pytania. Jak się okazuje, „Java lub C ++” to trochę czerwony śledź. Standardowa implementacja Java zapewnia wyrzucanie elementów bezużytecznych i C ++ nie jest zgodne ze standardem językowym, ale nie ma absolutnie żadnego powodu, dla którego nie można używać zewnętrznego modułu wyrzucania elementów bezużytecznych dla C ++. Wiele firm zarabiało na życie sprzedając te rzeczy, a niektóre zapewne zarabiały na życie, rozdając je za darmo.