Wieder mal Alignment von Strukturen
-
hab gerade in nem anderen thread was über realloc bzw. block und zeichenweise verarbeitung gelesen. also mal angenommen ich habe ein struct
struct{ int x; char y; };
bei der größe gehe ich jetzt einfach mal von 5 byte aus. jetzt besorg ich mir via malloc/realloc platz für 2 strukturen (10 byte). mal angenommen das erste wäre ausgerichtet, ist dann das zweite auch ausgerichtet?
-
Wenn es 10 Byte sind, kann die zweite Struktur gar nicht ausgerichtet sein.
-
Nick Unbekannt schrieb:
Wenn es 10 Byte sind, kann die zweite Struktur gar nicht ausgerichtet sein.
hm, dann sollte ich evtl. meine structs umstellen? dann käm ich auf 2*8=16? dann ist doch das problem behoben
struct{ char y; int x; };
-
Frage ist nur, was du genau damit erreichen willst? Wenn es dir nur um die Strukturierung deiner Daten geht, dann kannst du dort sortieren, wie du lustig bist. Manchmal erfüllt man mit der Anordnung aber auch einen logischen Zweck, dass man zusammengehörendes nicht trennen will. Abhilfe, die zugegeben etwas fricklig ist, wären selber Füllbytes in die Struktur zu bringen. Bei einer maximalen Anzahl von 3 (7?) Stück, sollte man damit auch nicht allzu durcheinander kommen. Aber ist denn deine erste Struktur auch nur 5 Bytes groß gewesen? Vielleicht ist dieser Schritt ja völlig unnötig gewesen.
-
Nick Unbekannt schrieb:
Frage ist nur, was du genau damit erreichen willst?
es war etwas worauf ich in dieser form noch nie geachtet hab. alles was ich bisher las schlug immer vor absteigend zu sortieren um möglichst wenig padding zu haben. an füllbytes am ende kann ich mich in dem text aber auch nicht erinnern
Nick Unbekannt schrieb:
Manchmal erfüllt man mit der Anordnung aber auch einen logischen Zweck, dass man zusammengehörendes nicht trennen will.
dann brauchst aber meistens gleich ein packed-struct.
Nick Unbekannt schrieb:
Aber ist denn deine erste Struktur auch nur 5 Bytes groß gewesen? Vielleicht ist dieser Schritt ja völlig unnötig gewesen.
das struct war fiktiv, ich suchte nur ein praxisnahes beispiel.
-
Die Strukuren werden meines Wissens immer an Potenzen von 2 gerichtet (per Standarteinstellung von Visual Studio 4 Byte). Deine Struktur mit 5 Byte würde bei
y
mit 3 Bytes "aufgebläht" werden.Egal ob:
struct{ int x; char y; };
oder:
struct{ int x; char y; };
, ein Objekt der Struktur wird 8 Byte brauchen.
-
_-- schrieb:
Nick Unbekannt schrieb:
Manchmal erfüllt man mit der Anordnung aber auch einen logischen Zweck, dass man zusammengehörendes nicht trennen will.
dann brauchst aber meistens gleich ein packed-struct.
Mir ging es dabei mehr um den logischen Aspekt beim Programmieren. Einen Quelltext sollte man auch lesen können und das ohne sich ewig lange alle Dinge zusammen suchen zu müssen.
Auf Dinge wie gepackte Strukturen sollte man lieber verzichten, solange es möglich ist. Dass verleitet nur zu unsauberen Tricksereien.
-
Der aus dem Westen ... schrieb:
Die Strukuren werden meines Wissens immer an Potenzen von 2 gerichtet (per Standarteinstellung von Visual Studio 4 Byte). Deine Struktur mit 5 Byte würde bei
y
mit 3 Bytes "aufgebläht" werden.danke, wieder was gelernt.
-
Der aus dem Westen ... schrieb:
Die Strukuren werden meines Wissens immer an Potenzen von 2 gerichtet (per Standarteinstellung von Visual Studio 4 Byte). Deine Struktur mit 5 Byte würde bei
y
mit 3 Bytes "aufgebläht" werden.Nö, darüber kann man einfach keine Aussage machen. Da ist alles erlaubt. Wenn du über MS-Standarteinstellungen (das wird nicht zensiert??) reden willst, mach das bitte im MS-Forum.
-
Wenn das Struct so tatsächlich 5 Byte groß ist (Annahme: sizeof(int) == 4), ist seine Ausrichtung im Zweifel auf 1 Byte. Fordert man dann 10 Byte an und betrachtet es als Array von zwei Elementen, sind sowohl das erste als auch das zweite auf 1 Byte ausgerichtet. Richten wir es auf 2 Byte aus, hieße das beispielsweise eine Größe von 6 Byte. In diesem Fall braucht es 12 Byte für zwei Elemente, und beide sind auf 2 Byte ausgerichtet.
Generell ist die Größe eines Structs ein Vielfaches seiner Ausrichtung. Deswegen klappt das mit Arrays immer. "Unausgerichtet" ist, wenn man so will, halt einfach nur eine Bezeichnung für "ausgerichtet auf 1 Byte"; ein eigentlicher Sonderfall ist das nicht.
Übrigens kann man solche Struct-Packerei durchaus nicht auf allen Architekturen zuverlässig betreiben. RISC-Maschinen werfen wegen solcher Scherze gerne Laufzeitfehler bei load- bzw. store-Instruktionen. x86 und x86-64 sind da sehr umgänglich; die können problemlos auch mitten in ein Maschinenwort greifen, solange man keine SSE2-Anweisungen braucht.