App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
[C] Größe / Ausrichtung von structs
- Ersteller ThePsycho
- Erstellt am
Hallo,
ich werkel immernoch ein wenig am Kernel rum und bin auf folgendes gestoßen:
Ich habe ein struct:
Wie man sich leicht ausrechnen kann sind das 6 Bytes. Ein sizeof(struct oha) liefert aber 8 (auf 32 Bit x86) - ist das so festegelegt? Wird immer auf eine 4-Byte-Größe aufgerundet? Oder ist das gar eine Eigenheit des GCC (Version 4.1 btw.)?
Weitere Frage:
Welche Bytes bleiben dann unbenutzt? x[0 + 1] oder x[6 + 7]?
Danke.
ich werkel immernoch ein wenig am Kernel rum und bin auf folgendes gestoßen:
Ich habe ein struct:
Code:
struct oha {
u8 a : 4,
b : 4,
u8 c : 4,
d : 4,
u32 e : 30,
f : 2
}
Wie man sich leicht ausrechnen kann sind das 6 Bytes. Ein sizeof(struct oha) liefert aber 8 (auf 32 Bit x86) - ist das so festegelegt? Wird immer auf eine 4-Byte-Größe aufgerundet? Oder ist das gar eine Eigenheit des GCC (Version 4.1 btw.)?
Weitere Frage:
Code:
char x[8];
struct oha *p = (struct oha *) x;
Welche Bytes bleiben dann unbenutzt? x[0 + 1] oder x[6 + 7]?
Danke.
Zuletzt bearbeitet:
Wie man sich leicht ausrechnen kann sind das 6 Bytes. Ein sizeof(struct oha) liefert aber 8 (auf 32 Bit x86) - ist das so festegelegt? Wird immer auf eine 4-Byte-Größe aufgerundet?
Das ist Absicht, du bist auf einer Maschine, deren Worte 32bit breit sind.
Teilweise ist es sogar von Vorteil noch mehr "Füllbytes" einzubringen (Stichwort Cachezeilenbreite)
Probiere es aus...Weitere Frage:
Code:char x[8]; struct oha *p = (struct oha *) x;
Welche Bytes bleiben dann unbenutzt? x[0 + 1] oder x[6 + 7]?
x[0]=0;
x[1]=1;
...
x[7]=7;
und danach greife mal auf die Elemente deines Structs zu und gebe diese ggf. hex aus.
Gruß,
TheJudger
PuckPoltergeist
Grand Admiral Special
__attribute((packed)) sollte dir hier weiter helfen:
struct oha {
...
} __attribute((packed));
Damit verhinderst du das alignment der struct-member.
struct oha {
...
} __attribute((packed));
Damit verhinderst du das alignment der struct-member.
@Puck das werd ich mal testen, danke.
Unklar ausgedrückt, sry.
Ausprobieren ist klar, meine Frage zielte eher darauf, ob es der C-Standard fest vorschreibt, wie genau das auszusehen hat.Probiere es aus...
Unklar ausgedrückt, sry.
Ray
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 3.141
- Renomée
- 20
- Standort
- An der Spree
- Mein Laptop
- Kein Notbuch
- Prozessor
- Intel Core2Quad Q9650@3.8, AMD Ryzen 9 under test
- Mainboard
- DFI LANPARTY LT X48-T2R + MIPS DFI LANparty P35/X38/X48 Series Freezer Set Nickel
- Kühlung
- EK-Supreme
- Speicher
- 4 x 2 GB OCZ PC2 8500 C5 Reaper@500
- Grafikprozessor
- XFX 8800 GTS(G92) 512 + EK-FC8800 GT/GTS(g92)
- Display
- TFT HP w2408h, 1920x1200
- SSD
- Samsung 840 Pro 256 GB
- HDD
- 2 x WD Black 1TB
- Optisches Laufwerk
- Samsung SH-D163A, Samsung SH-S183A
- Soundkarte
- Creative X-FI Xtreme Gamer Fatality Pro
- Gehäuse
- Modified Lian Li PC201B
- Netzteil
- Seasonic S12 550W
- Betriebssystem
- Win7U-64
- Webbrowser
- FireFox
- Verschiedenes
- Thermochill PA120.3 Triple Radiator , Liang DDC , 11 years old mainboard, still running!
Was der C-Standard hier vorschreibt, müsstest Du im selben nachlesen.Ausprobieren ist klar, meine Frage zielte eher darauf, ob es der C-Standard fest vorschreibt, wie genau das auszusehen hat.
Unklar ausgedrückt, sry.
Es ist auf jeden Fall abhängig vom Compiler und der Zielmaschine.
Das Verhindern des Auffüllens wird auch unterschiedlich gehandhabt. Mal sind es spezifische Anweisungen wie __attribute((packed)), bei einem anderen Compiler ist es #pragma(packed) oder per Option beim Compileraufruf.
Auf Strukturen und Alignment muss man jedenfalls immer aufpassen, wenn entsprechende Daten zwischen verschiedenen (Prozessor-) Systemen übertragen werden müssen. Auch die Reihenfolge der Datenbytes kann eine Rolle spielen, Stichworte Big- und Little-Endian.
PuckPoltergeist
Grand Admiral Special
Da ich den Standard jetzt nicht vor mir liegen habe, sind die folgenden Aussagen ohne Garantie. Aber wie Ray schon geschrieben hat, ist das Alignment von der Zielplattform abhängig. Und damit kann der Standard garnichts vorschreiben, denn der ist Hardware-unabhängig. Und das "Problem" hier ist auch nicht das Alignment des struct sondern seiner Member. Die u8 Teile werden wahrscheinlich an 8 Bit Adressen ausgerichtet, der u32 Teil hingegen an an einer 32 Bit Adresse. Das heißt das erste Element wird an einer 32 Bit Adresse ausgerichtet, das zweite an der nächsten 8 Bit Adresse und das dritte dann an der nächsten 32 Bit Adresse. Du hast also ein Lücke innerhalb des struct, nicht am Anfang oder Ende.
andr_gin
Grand Admiral Special
- Mitglied seit
- 12.06.2003
- Beiträge
- 3.052
- Renomée
- 24
- Standort
- St. Pölten (60km westlich von Wien)
- Prozessor
- Core 2 Quad Q6600 @2,7GHz
- Mainboard
- ASUS P5B Deluxe
- Kühlung
- Zalman CNPS 9700 LED
- Speicher
- 2x1GB DDR2 800
- Grafikprozessor
- Connect3D X1800XT 256MB
- Display
- Hanns.G 27,5"
- HDD
- Samsung 200GB SATA System, 8x Samsung 500GB RAID 50 (RAID5 über den Controller, RAID0 über Windows
- Optisches Laufwerk
- Samsung DVD-Brenner
- Soundkarte
- onboard
- Gehäuse
- A+ XClio2
- Netzteil
- Xilence 550Watt
- Betriebssystem
- Vista x64 SP1
- Webbrowser
- Mozilla Firefox 3
Also wenn du Daten als struct irgendwo hineinschreibst, dann musst du sie auch als struct wieder herauslesen. Alles andere ist Pfuscherei. Das kann zwar momentan hinhauen, aber wenn du dann den Compiler wechselst, haut alles nicht mehr hin und keiner weiß wieso.
Ok, die Frage ist ja zum Glück inzwischen, durch "__attribute((packed))", nicht mehr relevant.
Im Linux-Kernel wird ja allgemein von GCC ausgegangen, dann werde ich das auch so halten.
Danke jedenfalls für die Antworten.
@andr_gin
Keine Sorge, sowas hatte ich nicht vor.
Im Linux-Kernel wird ja allgemein von GCC ausgegangen, dann werde ich das auch so halten.
Danke jedenfalls für die Antworten.
@andr_gin
Keine Sorge, sowas hatte ich nicht vor.
andr_gin
Grand Admiral Special
- Mitglied seit
- 12.06.2003
- Beiträge
- 3.052
- Renomée
- 24
- Standort
- St. Pölten (60km westlich von Wien)
- Prozessor
- Core 2 Quad Q6600 @2,7GHz
- Mainboard
- ASUS P5B Deluxe
- Kühlung
- Zalman CNPS 9700 LED
- Speicher
- 2x1GB DDR2 800
- Grafikprozessor
- Connect3D X1800XT 256MB
- Display
- Hanns.G 27,5"
- HDD
- Samsung 200GB SATA System, 8x Samsung 500GB RAID 50 (RAID5 über den Controller, RAID0 über Windows
- Optisches Laufwerk
- Samsung DVD-Brenner
- Soundkarte
- onboard
- Gehäuse
- A+ XClio2
- Netzteil
- Xilence 550Watt
- Betriebssystem
- Vista x64 SP1
- Webbrowser
- Mozilla Firefox 3
Naja bei uns hat das sogar unser unfähiger Programmierlehrer in seinem Beispiel gemacht und die ganzen Leute, die seit 1-2 Monaten C lernen, haben sich das ganze Programm damit herumschlagen können, dass die Daten nicht stimmen (Endianess), weil einfach seine read-Funktion Mist geliefert hat.
Ähnliche Themen
- Antworten
- 764
- Aufrufe
- 101K
- Antworten
- 16
- Aufrufe
- 7K
- Antworten
- 469
- Aufrufe
- 78K
- Antworten
- 0
- Aufrufe
- 52K