Jak szeroko stosowany jest alloca
w prawdziwym świecie? Czy powinienem uczyć moich uczniów używania, alloca
gdy ma to sens? Czy powinienem ich nauczyć, aby nigdy ich nie używali? Pochodzący z tła C ++ RAII pomysł, że nie trzeba free
ręcznie wywoływać, brzmi obiecująco, szczególnie w funkcjach z wieloma punktami wyjścia.
18
malloc
.Odpowiedzi:
Jeśli prowadzisz kurs z ogólnego programowania C, nie powinieneś uczyć ich czegoś , co nie jest w standardzie. Początkujący programiści niepotrzebnie piszący niestandardowy i / lub nieprzenośny kod, ponieważ zostali w ten sposób nauczeni, był ogromnym problemem dla branży oprogramowania w ciągu ostatnich 20-30 lat. Koszt nie uczenia ich standardu i nic poza standardem jest prawdopodobnie astronomiczny.
Jeśli prowadzisz bardziej zaawansowany kurs algorytmów lub programowania aplikacji, warto o tym wspomnieć. Z drugiej strony programowałem wszystko, od twardych aplikacji osadzonych w czasie rzeczywistym do puchu aplikacji Windows przez 15 lat bez użycia tej funkcji.
źródło
Widzę dwie rzeczy:
Uczniowie rozumieją wpływ
alloca
, czytają o różnicach między stosem a stosem i używają goalloca
ostrożnie. (mało prawdopodobne)Uczniowie myślą: „wow, to jest jak
malloc
bez martwienia się ofree
”, używaj go nadmiernie, dostajesz przepełnienie stosu i nie mam pojęcia, co jest grane.Myślę, że jest znacznie lepiej, jeśli opisujesz
alloca
, a następnie uruchom ten kod:Źródło: http://www.strchr.com/alloca
pokaż im niebezpieczeństwa, a następnie powiedz, żeby ich nie używali. Nadal będą się uczyć o stosie a stercie, zobaczą niebezpieczeństwa w akcji i będą mogli przejść do standardowych rzeczy.
źródło
_alloca
a niealloca
? I dlaczego to rzuca wynik?Odpowiedź na to pytanie powinna opierać się przede wszystkim na twoich celach .
Czy chcesz nauczyć kogoś, kto już umie programować, jak pisać C i pracować z istniejącym kodem C w środowisku naturalnym? Jeśli tak, powiedz o alokacji i wszystkim, czego chcesz.
Z drugiej strony, jeśli prowadzisz kurs wprowadzający, w którym używa się C tylko przez przypadek (a ponieważ C jest bardzo małym językiem itd.), Powinieneś skupić się na ważnych częściach (pisanie programów modułowych, podprogramów, kolekcji itp. .). Z perspektywy studenta alokacja jest zbędna, ponieważ w większości przypadków wystarcza malloc, a z punktu widzenia dobrego kodu lepiej wyraźnie wspomnieć o tym, jak ręczne zarządzanie pamięcią jest denerwujące i jak inne języki radzą sobie z tym problemem. W końcu jest więcej rzeczy do zarządzania pamięcią, a następnie alokacją lub RAII, więc naprawdę nie powinieneś ograniczać się do nich, a jak już wspomniałeś, o wiele łatwiej jest zrozumieć cel alokacji, jeśli porównasz go z innymi „bardziej standardowymi” sposobami robienia rzeczy w innych językach (lub C99 ...)
źródło
Nie.
Jedynym powodem, dla którego programista C powinien być świadomy istnienia przydziału, jest zrozumienie i poprawienie używającego go starszego kodu.
Każde użycie
alloca
jest alboOprócz kilku eksperymentów myślowych, dla których nigdy nie znalazłem żadnych przykładów w świecie rzeczywistym, nie ma przypadku użycia
alloca
(lub VLA), który nie byłby ani bezużyteczny, ani wrażliwy (jeden z powyższych 2 przypadków).źródło
alloc
jest w 100% równoważne z automatycznymi tablicami o stałej wielkości i mniej przenośne.T foo[5000];
lub cokolwiek innego.std::mutex
, mógłbym wywołać wywołanie jądra i przełącznik kontekstu dla pięciu tysięcy muteksów. Nie tanie. Nie wspominając o dodatkowych kosztach pamięci podręcznej umieszczania zmiennych lokalnych po tablicy.Moim zdaniem nie zachęcam do korzystania z niego, chyba że uczysz zasad kompilatora niskiego poziomu używanych do przydzielania miejsca na stosie dla zmiennych lokalnych. Naucz tego w tym kontekście.
źródło
Dokumentacja GCC ma kilka praktycznych zalet i wad
alloca()
. Z praktycznego punktu widzenia korzysta z niego spora ilość wolnego oprogramowania, więc dobrze jest zrozumieć, jak działa i gdzie jest używany w istniejącym kodzie.Przekazywanie
-Wl,-stack=
nowego rozmiaru stosu do gcc zwiększa maksymalny rozmiar stosu; musisz to zrobić, jeśli Twój projekt używaalloca()
lub przydziela duże tymczasowe tablice lub używa rekurencji poza określoną głębokość zależną od kontekstu.źródło