Schreibt der Standard die Behandlung von Padding Bytes vor?
-
Hallo,
ich wollte eine Templatefunktion schreiben, die das Objekt eines Typen in einzelne bytes zerlegt und in "byteform" speichert.template<typename T> void make_byte(const T& objekt) { byte* p = new byte[sizeof(T)]; memcpy(p, reinterpret_cast<byte*>(&objekt), sizeof(T)); }
Ich habe nur die Befürchtung, dass das ganze nicht wirklich definiert bzw. portabel ist, wegen der Padding Bytes.
Ist es vorgeschrieben, wie viele Padding Bits/bytes vom Compiler bei einem Typen verwendet werden oder kann das von Compiler zu Compiler variieren? Und sind diese Padding bits/bytes alle "0" oder haben sie zufällige Werte?Schonmal Danke für Antworten
-
Das variiert. Sogar auf dem selben COmpiler bei unterschiedlichen Einstellungen. Und der Wert drin ist auch undefiniert.
-
Die Serialisierung ist nicht nur wegen den Padding-Bytes nicht portabel, sondern auch wegen möglicherweise Little-Endian vs. Big-Endian.
Das Padding-Problem besteht im übrigen auch beim Vergleich von Klassen bzw. Strukturen. Dies ist auch der Grund, warum man nicht einfach memcmp() darauf anwenden kann.
-
nachdem der OP nicht schreibt dass er sich auf PODs beschränken will, kommen noch ca. 100 andere sachen dazu, die der standard nicht abdeckt.
und selbst bei PODs käme noch dazu...
* ob one's complement oder two's complement (oder vielleicht ganz was anderes) verwendet wird
* dass die verschiedenen typen (int, short, ...) nicht überall gleich gross sind
* wie "true" in einem "bool" dargestellt wird (z.B. 0xFF oder 1)