Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CodingCat

1x Contest-Sieger

  • »CodingCat« ist der Autor dieses Themas

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

1

25.05.2003, 17:45

"STRUKTURMITGLIED AUF 1 BYTE AUSRICHTEN"

Hi,

in den Quelltexten kommt ja öfters vor:

Quellcode

1
2
3
4
5
6
7
8
_________________________________________________
|                                               |
|   ACHTUNG:                                    |
|   ========                                    |
|   DIESE DATEI MUSS MIT DER COMPILER-OPTION    |
|   "STRUKTURMITGLIED AUF 1 BYTE AUSRICHTEN"    |
|   KOMPILIERT WERDEN!                          |
|                                               |

Was genau soll das? Warum muss man das machen?
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.05.2003, 18:13

Wenn man z.B. eine 3DS-Datei öffnen möchte, dann kann das oft Probleme geben, wenn man Daten aus der Datei direkt in eine Struktur (struct) lesen will, denn der Compiler ordnet die struct-Elemente gerne so an, dass sie jeweils in 8 Bytes - Intervallen im Speicher ausgerichtet sind. Teile der gelesenen Daten gehen dann einfach verloren, weil sie in den Speicher "zwischen" zwei Elemente geladen werden.
Die Option #pragma pack(1) verhindert das.

3

02.06.2003, 11:26

Ich habe mir letzte Woche das Buch gekauft und bin bisher eigentlich positiv überrascht. Gibt zwar einige Dinge die ich noch nicht verstehe und ein paar Dinge die ich nicht gut finde (bin allerdings auch erst auf Seite 120), aber dafür habe ich bisher wesentlich mehr verstanden als in anderen Büchern. Grosses Lob!

Nun zu meiner eigentlichen Frage.

Ich hatte das mit dem Struktur ausrichten auch schon einmal machen müssen, weil ein Programm das ich erstellt habe auf einem Rechner eine Datei ohne Probleme lesen konnte, auf einem anderen Rechner die Daten in der Struktur verfälscht waren. Hatte dann den Tip mit dem Ausrichten bekommen, es aber nie verstanden.

Auch die obige Erklärung verstehe ich noch nicht so ganz. Soll es bedeuten das jedes Element jeweils 8 Bytes nach dem letzten anfängt? Warum macht der Compiler das?

Wenn man jetzt aus einer Datei lädt und eine Struktur füllt, dann werden die Daten allerdings nicht so ausgerichtet sondern 1:1 in den Speicherbereich der Struktur kopiert?

Wieso wird das beim Laden nicht automatisch beachtet bzw warum werden Strukturelemente nicht automatisch auf 1 Byte ausgerichtet?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

02.06.2003, 15:32

Ich verstehe auch nicht ganz, wann er es macht. Aber er tut es, weil die meisten Prozessoren Daten schneller verarbeiten können, die an Speicheradressen, die durch 8 oder 16 teilbar sind, liegen.

Anonymous

unregistriert

5

02.06.2003, 17:36

Ach ja, das macht Sinn. Bei Klassen gilt das Ganze aber nicht oder?

Werbeanzeige