• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Unikanięcie nadmiernego zużycia pamięci przez wielokrotnie wywoływaną funkcję

Object Storage Arubacloud
0 głosów
185 wizyt
pytanie zadane 28 października 2017 w C i C++ przez mduchalski Nowicjusz (200 p.)

Witam,

Usiłuję zaimplementować algorytm SHA-1 w języku C, docelowo w celu przeniesienia na mikrokontroler AVR. Minimalne zużycie pamięci jest więc dla mnie priorytetem. Drażni mnie jednak pewne pytanie. Załóżmy, że mam zdefiniowaną pewną funkcję, a w niej zadeklarowane zmienne lokalne o łącznej wielkości N bajtów. Powiedzmy, że dalej wykonam tę funkcję w moim kodzie i razy (różne wejścia). Ile pamięci będzie zajęte po opuszczeniu ostatniego wykonania funkcji? N, i*N, czy może 0 bajtów?

Jeśli i*N, to jak ograniczyć je do N? Myślałem o zastosowaniu globalnej struktury ze zmiennymi funkcji - niezbyt estetyczne w zapisie przy wielu zmiennych. O stosowaniu dynamicznej alokacji pamięci w AVRach słyszałem, że to kiepski pomysł.

Pozdrawiam i z góry dziękuję za odpowiedzi.

 

1 odpowiedź

+1 głos
odpowiedź 28 października 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 28 października 2017 przez mduchalski
 
Najlepsza

Zakładając że Twoja funkcja ma wyłącznie zmienne automatyczne (nie posiada zmiennych statycznych), zajętość pamięci po opuszczeniu ostatniej to będzie 0 (zero) bajtów. Nieco inaczej będzie z zajętością chwilową pamięci.

Jeśli funkcja będzie wywoływana i będą z niej powroty bezpośrednio (np. pętla for czy while i wywołanie funkcji w ciele pętli a przed powrotem do następnej iteracji jest wyjście z funkcji), to zajętość chwilowa to N. Czyli N bajtów poświęcanych na zmienne automatyczne (patrz założenie braku statycznych). 

Jeśli jednak sama funkcja rekurencyjne będzie wołała siebie lub inne, tu problem będzie złożony. W najgorszym przypadku będzie to N * i gdzie i to ilość zagnieżdżeń rekurencji. 

I w tym ostatnim przypadku także jest wyście. Można stosować tzw. rekurencję ogonową która ( choć tak standard C jak i C++ o tym nie mówi), w większości kompilatorów powoduje optymalizację. Z całą pewnością dzieje się tak w avr-gcc. Wtedy zużycie chwilowe RAM to N.

Podobne pytania

+1 głos
1 odpowiedź 526 wizyt
pytanie zadane 14 października 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
0 odpowiedzi 117 wizyt
0 głosów
1 odpowiedź 277 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...