Filestream write() - Serialisierung von C++-Klassen
-
Padding ist durchaus interessant.
#include <iostream> using namespace std; class A { public: char a; char b; int c; }; class B { public: char a; int c; char b; }; int main(void) { int sizeA = sizeof(A); int sizeB = sizeof(B); cout << "A = " << sizeA << endl; cout << "B = " << sizeB << endl; return 0; }
Mein VC++ liefert mir hier die Ausgabe:
A = 8 B = 12
sizeof(9 auf einer Klasse aufzurufen scheint wirklich ziemlich abenteuerlich zu sein.
-
Und jetzt füge Mal virtuelle Funktionen hinzu...
~Ich nehme an, dir ist klar, dass struct das selbe ist wie class, nur mit einem standardmäßigem public-Sichtbarkeitsbereich~
-
Oberon_0 schrieb:
Ich nehme an, dir ist klar, dass struct das selbe ist wie class, nur mit einem standardmäßigem public-Sichtbarkeitsbereich
Ist mir bekannt.
Oberon_0 schrieb:
Und jetzt füge Mal virtuelle Funktionen hinzu...
Interessant. sizeof() liefert mit einer virtielle Funktion nun 16, statt 12 zurück. Dürfte wohl der zusätzlich Pointer (0) sein?
-
Interessant. sizeof() liefert mit einer virtielle Funktion nun 16, statt 12 zurück. Dürfte wohl der zusätzlich Pointer (0) sein?
Ja, der Pointer zur Functiontable.
Und jetzt erbe die Klasse, und füg neue virtuelle Funktionen dazu.Aber ernsthaft: Sachen in eine POD-Representation bringen und direkt schreiben/lesen ist imo keine so schlechte Idee, man sollte halt compilerunabhängig Padding/Alignment festsetzen und auf die Endianess aufpassen.
-
Ethon schrieb:
Aber ernsthaft: Sachen in eine POD-Representation bringen und direkt schreiben/lesen ist imo keine so schlechte Idee, man sollte halt compilerunabhängig Padding/Alignment festsetzen und auf die Endianess aufpassen.
Meiner Ansicht nach ist davon eher strikt abzuraten, zumindest wenn man in ANSII C++ programmiert.
Dann lieber Boost verwenden oder den operator<< überladen und die Daten selbst im festen Format schreiben.
Alles andere sieht mir angesichts der Sachlage nach ziemlichen Murks aus.
-
Katzenzunge_n schrieb:
Ethon schrieb:
Aber ernsthaft: Sachen in eine POD-Representation bringen und direkt schreiben/lesen ist imo keine so schlechte Idee, man sollte halt compilerunabhängig Padding/Alignment festsetzen und auf die Endianess aufpassen.
Meiner Ansicht nach ist davon eher strikt abzuraten, zumindest wenn man in ANSII C++ programmiert.
Dann lieber Boost verwenden oder den operator<< überladen und die Daten selbst im festen Format schreiben.
Alles andere sieht mir angesichts der Sachlage nach ziemlichen Murks aus.
Die meisten Fileformate sind allerdings binär. Was auch einen Grund hat.
Geringerer Platzbedarf und man muss nicht parsen.Wer möchte denn 100MB große Mp3 Dateien haben, die mehrere Sekunden laden?
-
Nur sind solche Formate dann standardisiert und hängen nicht von Compiler und Plattform ab. Natürlich machen Binärformate Sinn, aber sobald du sowas portabel hinkriegen willst, musst du eh memberweise vorgehen. Zumal in C++ der Grossteil der Klassen keine PODs sind.
Du kannst das Ganze auch abstrahieren, wie das Boost.Serialization mit seinen Archiven macht. Auf der einen Seite schreibst und liest du die einzelnen Member, auf der anderen Seite hast du ein Archiv, welches die aufgerufenen Schreib-/Lesefunktionen umsetzt. Diese Umsetzung bestimmt dann das eigentliche Format. Das kann sowohl Text als auch binäre Daten sein.