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
Auf einer anderen Platform richtet der Compiler die Struktur vielleicht an nem anderen Alignment aus. Und dann ließt du nicht mehr die Daten richtig ein. Das ließe sich noch beheben, in dem man das Alignment vorgibt. Aus Effizienzgründen würde ich das aber für eine Vektorklasse aber vielleicht nicht tun.
Auf einer anderen Platform richtet der Compiler die Struktur vielleicht an nem anderen Alignment aus. Und dann ließt du nicht mehr die Daten richtig ein. Das ließe sich noch beheben, in dem man das Alignment vorgibt. Aus Effizienzgründen würde ich das aber für eine Vektorklasse aber vielleicht nicht tun.
Hast du zufällig konkrete Beispiele dafür, wie das wo standardmäßig aussieht? Ich meine, mit Binärdateien gibt es eine Menge Probleme, Datentypen können auch unterschiedlich groß sein, die Bitreihenfolge kann unterschiedlich sein und unterschiedliche Prozessoren können komplett unterschiedliche Darstellungen z.B. für Fließkommazahlen benutzen. Die Frage ist halt, ob das nur auf exotischen Plattformen passiert, oder ob das bei eines von den Problemen tatsächlich andauernd auftritt. Da kenn ich mich jetzt nicht wirklich aus, deswegen hätte ich gerne Beispiele dafür.
Textdateien sind generell sehr viel robuster und haben andere Vorteile. Aber Binärdateien sind halt um ein so vielfaches schneller, bzw. können es sein. Wenn man Für jedes Objekt eine Speicherfunktion aufrufen muss, die intern für jede Variable Funktionen aufruft und vielleicht noch Dinge hin und herkopiert, belastet das die CPU und den Hauptspeicher und so viel mehr, wie wenn man einfach sagt "Hier hast du 5MB, knall mir die bitte auf die Platte." Sowas kann sich schon mehr als spürbar auf die Ladezeiten auswirken.
Das geht aber halt nicht immer, zum Beispiel wenn man komplexe Datenstrukturen benutzt, oder wenn man eben recht unterschiedliche Plattformen unterstützen will. Aber nur deswegen würde ich doch nicht kategorisch darauf verzichten.
Zitat
-mpreferred-stack-boundary=num Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128 bits), except when optimizing for code size (-Os), in which case the default is the minimum correct alignment (4 bytes for x86, and 8 bytes for x86-64).
On Pentium and PentiumPro, double and long double values should be aligned to an 8 byte boundary (see -malign-double) or suffer significant run time performance penalties. On Pentium III, the Streaming SIMD Extension (SSE) data type __m128 suffers similar penalties if it is not 16 byte aligned.
Zitat
The only notable difference in alignment for a 64-bit system when compared to a 32-bit system is:
- A long (eight bytes) will be 8-byte aligned.
- A double (eight bytes) will be 8-byte aligned.
- A long double (eight bytes with Visual C++, sixteen bytes with GCC) will be 8-byte aligned with Visual C++ and 16-byte aligned with GCC.
- Any pointer (eight bytes) will be 8-byte aligned.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Wo ist das Problem mit Alignment? Das die Datei ein wenig größer wird?
Und wo ist das Problem mit Referenzen? Außer dass die zweite Funktion natürlich nicht kompiliert weil ich copy'n'paste benutzt habe und der vector konstant ist.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (12.03.2012, 16:40)
A long double (eight bytes with Visual C++, sixteen bytes with GCC) will be 8-byte aligned with Visual C++ and 16-byte aligned with GCC.
Der Code würde kompilieren, da ich von Referenz-Member-Variablen in der Klasse rede, die als Datentyp im Vektor liegt. Es würden Speicher-Adressen in der Datei landen und beim Auslesen invalide Speicheradressen gelesen werden.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
A long double (eight bytes with Visual C++, sixteen bytes with GCC) will be 8-byte aligned with Visual C++ and 16-byte aligned with GCC.
Hm, aber das ist nicht direkt ein Alignment Problem, sondern ein Problem von unterschiedliche großen Variablen, oder nicht? Da hat man dann beim binären Speichern eh schon Probleme.
C-/C++-Quelltext |
|
1 2 3 4 |
struct foo { char x; float a; } |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Werbeanzeige