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



Teraz jest 29 mar 2024, o 06:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 13 mar 2017, o 21:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Jak jest z kolejnością danych w strukturze (dane różnych długości: uint16, uint8 uint32 itd itp.)? Czy jest taka, jak przy definicji, czy też kompilator dla optymalizacji ją zmienia.
Gdzieś widziałem jakieś atrybuty, które niby powodowały to, że dane umieszczane były w pamięci w kolejnościach ich deklaracji, ale za chiny ludowe nie mogę tego odnaleźć.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 08:30 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

Mi tam zawsze leci za koleją.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 09:07 
Offline
Nowy

Dołączył(a): 11 mar 2017
Posty: 16
Zbananowany użytkownik

Pomógł: 1

Kolejność danych jest taka jak w definicji struktury. Ale między kolejnymi polami mogą być "puste miejsca". Kompilator może je wstawiać, żeby ułatwić i przyspieszyć dostęp do danych. Jeśli takie działanie jest niekorzystne stosuje się specjalne opcje kompilatora, żeby struktura była "spakowana", czyli bez dodatkowych elementów.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 10:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

No, zaczynam sobie przypominać. Gdzieś tu na forum widziałem taki atrybut przy definicji struktury:
__attribute__ ((packed))
Ma to spowodować "wywalenie" wszystkich dziur w strukturze.
Co chcę osiągnąć - chcę mieć dostęp do wszystkich bajtów w strukturze i mieć pewność, że operuję teraz na bajcie wyższym lub niższym konkretnej zmiennej int w strukturze. Można to osiągnąć poprzez unię struktury z tablicą, ale jak mi kompilator "porozwala" kolejności danych w strukturze to kicha. Według kolejności deklarowania zmiennych będę myślał, że operuję na bajcie np. zmiennej A typu char, a w rzeczywistości będę modyfikował bajt innej zmiennej.
Po zastosowaniu powyższego atrybutu zmienne b ed a po kolei (tak mi się przynajmniej wydaje). Z drugiej strony - ośmiobitowce mają dostęp do pamięci SRAM po jednym bajcie, więc nie powinno być żadnych dziur.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 12:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 369
Lokalizacja: Gliwice
Pomógł: 34

Polecam ten oto artykuł:
http://algorytmy.blox.pl/2008/02/Zabawy-z-sizeof.html

Uzupełniając, kolejność pól struktury możesz sobie definiować dowolnie, możesz je poprzestawiać jeśli zależy Ci na optymalizacji lub na sztywno wymusić optymalizację za pomocą opcji kompilatora.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 13:35 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

elvis napisał(a):
Ale między kolejnymi polami mogą być "puste miejsca"

To jest oczywiście prawda ale chciałbym zwrócić uwagę, że w przypadku AVR GCC i procków 8-bitowych nie ma żadnego sensu stosowanie atrybutów packed i w ogóle nie będzie żadnych wolnych czy tam pustych miejsc. Tu wszystko jest wyrównywane do jednego bajtu.

To wszystko o czym piszecie to zasady korzystania ze struktur albo na PC albo na prockach 32-bitowych gdzie dopiero wtedy występuje czasem konieczność paddingu (czyli wypełniania pól w strukturach aby wyrównać do np 32 bitów, 64 bitów itp)

Tak mi się wydaje.

------------------------ [ Dodano po: 6 minutach ]

APAP75 napisał(a):
ale jak mi kompilator "porozwala" kolejności danych w strukturze to kicha.

Jak wspomniałem wyżej - w 8 bitowcach w AVR GCC nic nie porozwala - no chyba że masz na myśli procki 32-bitowe


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2017, o 22:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Fakt - "czarodziejska" komenda sizeof() powie Ci wszystko ;)

_________________
Mr. Nobody



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: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO