Hvorfor ikke GCC optimalisere structs?

stemmer
42

Systemer kreve at visse primitiver være justert til visse punkter innenfor lager (ints til byte som er multipler av 4, shorts til byte som er multipler av 2, etc.). Selvfølgelig, kan disse være optimalisert til å kaste bort den minst plass i polstring.

Mitt spørsmål er hvorfor ikke GCC gjør dette automatisk? Er mer opplagt heuristisk (ordre variabler fra største størrelsen kravet til minste) mangler på noen måte? Er noen kode avhengig av fysisk bestilling av sine structs (er det en god idé)?

Jeg bare spør fordi GCC er super optimalisert i mange måter, men ikke i denne, og jeg tenker det må være noen relativt kjølig forklaring (som jeg er uvitende).

Publisert på 22/09/2008 klokken 22:46
kilden bruker
På andre språk...                            


7 svar

stemmer
73

gcc ikke endre rekkefølgen på elementene i en struct, fordi det ville krenke C standard. Seksjon 6.7.2.1 av C99 standarden tilsier:

Innenfor en struktur objekt, de ikke-bits--feltet-medlemmer og i hvilken enhet bit-felter ligge har adresser som øker i den rekkefølge de er deklarert.

Svarte 22/09/2008 kl. 23:13
kilden bruker

stemmer
25

Structs anvendes ofte som representasjoner av pakk rekkefølgen av binære filformater og nettverksprotokoller. Dette ville bryte hvis det ble gjort. I tillegg vil forskjellige kompilatorer optimalisere ting annerledes og linking kode sammen fra begge ville være umulig. Dette er rett og slett ikke gjennomførbart.

Svarte 22/09/2008 kl. 22:48
kilden bruker

stemmer
9

GCC er smartere enn de fleste av oss i å produsere maskinkode fra vår kildekoden; men jeg skjelve om det var smartere enn oss i re-arrangere våre structs, siden det er data som f.eks kan skrives til en fil. En struct som starter med 4 tegn, og deretter har en 4 byte heltall ville være ubrukelig hvis leste på et annet system hvor GCC besluttet at det skal re-arrangere struct medlemmer.

Svarte 22/09/2008 kl. 22:56
kilden bruker

stemmer
6

gcc SVN har en struktur omorganisering optimalisering (-fipa-struct-REORG), men det krever hel-program analyse og er ikke veldig kraftig i øyeblikket.

Svarte 31/10/2008 kl. 19:11
kilden bruker

stemmer
1

Ikke at det er en god idé, men du kan sikkert skrive kode som er avhengig av rekkefølgen av medlemmene av en struct. For eksempel som en hack, ofte folk kastet en peker til en struct som type et bestemt felt inne at de ønsker tilgang til, og deretter bruke pekeren aritmetikk for å komme dit. For meg er dette en ganske farlig idé, men jeg har sett det brukt, spesielt i C ++ for å tvinge en variabel som er blitt erklært privat å være offentlig tilgjengelig når det er i en klasse fra en tredje part bibliotek og er ikke offentlig innkapslet. Bestilling medlemmene ville helt bryte den.

Svarte 18/02/2009 kl. 19:18
kilden bruker

stemmer
1

C-kompilatorer ikke automatisk pakke structs nettopp på grunn av innretting problemer som du nevner. Åpner ikke på ordet grenser (32-bit på de fleste CPUer) bære tung straff på x86 og forårsake fatale feller på RISC arkitekturer.

Svarte 22/09/2008 kl. 22:50
kilden bruker

stemmer
0

Du ønsker kanskje å prøve den nyeste gcc stammen eller, struct-REORG-gren som er under aktiv utvikling.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf

Svarte 12/09/2015 kl. 04:25
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more