Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 17 lut 2026, o 23:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 12 paź 2015, o 15:59 
Offline
Użytkownik

Dołączył(a): 25 maja 2014
Posty: 92
Lokalizacja: Krosno
Pomógł: 0

Witam,
pisząc pewną funkcję do obsługi klawiaturki składającej się z 8 przycisków korzystałem ze zmiennych statycznych.
W związku z ich użyciem zauważyłem ciekawą rzecz:
- gdy zadeklarowałem zmienną "static", po kompilacji kod programu zwiększył swoją objętość o 30 bajtów oraz dodaje 2 bajty w RAM.
Zauważyłem to dzięki Eclipse Gadget, rewelacyjna sprawa':)))

oto ta funkcja:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


pytanie moje brzmi : co kompilator dodaje do kodu, że deklaracja zmiennej statycznej powoduje jego zwiększenie?

Z góry dziękuję za odpowiedź:)

_________________
Artur



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 17:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2014
Posty: 243
Pomógł: 9

A nie jest tak, że zmienna statyczna globalna tym bardziej będzie zajmowała miejsce w pamięci im częściej jest ona użyta w programie/funkcjach.
Procek przy każdym wystąpieniu zmiennej w różnych częściach programu musi pamiętać jej nową wartość a nie pierwotną wartość.

100% nie dam głowy, ale wydaje mi się że to będzie coś w tym kierunku.

_________________
http://www.ate-zbaszyn.eu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 17:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2014
Posty: 438
Lokalizacja: Zambrów
Pomógł: 22

Jeżeli tworzysz zmienną nie static w funkcji Klawiatura_8p to tworzy się zmienna lokalna, która widoczna jest tylko w obrębie tej funkcji i dodatkowo istnieje tylko podczas jej wykonywania przez program. Dlatego jej wartości są przetrzymywane nie w "standardowym" RAMie, a na stosie czyli pamięci RAM zapisywanej od końca, a nie od początku. Dlatego jest ona niewliczana w to co pokazuje gadget i eclipse o pamięci RAM.

Jeżeli natomiast dopiszesz static to ze zmiennej robi się (jak kolega yaiba83 wcześniej wspomniał) zmienna globalna jednak widoczna tylko w obrębie tej funkcji. Od tej pory zapisywana jest już w miejscu pamięci RAM przeznaczonym na zmienne globalne i dlatego zwiększa Ci się o 2 bajty RAM bo int jest właśnie tej wielkości. Dodatkowo masz więcej pamięci FLASH zużyte bo kompilator musi wykonać więcej czynności, aby (tak jak kolega wyżej wcześniej napisał) zmienna pamiętała swoją wartość za każdym razem gdy wchodzisz do funkcji.

To ile tego FLASHa jest zajęte zależy od tego jak używa się tej zmiennej i jak akurat zoptymalizuje to kompilator więc metodą prób i błędów można sobie w gadgecie zobaczyć i czasem coś zoptymalizować :)

Jeżeli źle mówię to proszę o uściślenie bądź poprawkę :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 19:09 
Offline
Użytkownik

Dołączył(a): 25 maja 2014
Posty: 92
Lokalizacja: Krosno
Pomógł: 0

Dzięki za odpowiedź:) Dużo wyjaśnia to co napisałeś, moje rozumowanie było właśnie w tym kierunku.
Co do pamięci RAM to rozumiem, ale szczerze mówiąc to co czasem robi kompilator z kodem to dla mnie jeszcze jest mocną zagadka:)
C dopiero się uczę, wcześniej pisałem w ASM i dlatego pewne mechanizmy działające w C są dla mnie jeszcze nie do końca zrozumiałe.

Dzięki jeszcze raz i pozdrawiam

_________________
Artur



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO