Ich las Game Coding Complete 4. Ausgabe. Es gibt ein Thema bezüglich Speicherausrichtung. Im folgenden Code sagt der Autor, dass die erste Struktur wirklich langsam ist, da sie weder Bit-ausgerichtet noch Byte-ausgerichtet ist. der zweite ist nicht ausgerichtet, sondern Byte-ausgerichtet. der letzte im Fasten, weil es beides ist. Er sagt, ohne den Pragma-Compiler wird der Speicher selbst ausgerichtet, was Speicherverschwendung verursacht. Ich konnte die Berechnungen nicht wirklich bekommen.Speicherausrichtung in C/C++
Dies ist ein Teil aus dem Text: -
Wenn der Compiler SlowStruct von ungenutzten Bytes Hinzufügen zu optimieren gelassen wurde, jede Struktur 24 Bytes statt nach gepolstert ist nur 14 Sieben zusätzliche Bytes wäre die erste char-Variable, und die verbleibenden Bytes werden am Ende hinzugefügt. Dies stellt sicher, dass die gesamte Struktur immer an einer 8-Byte-Grenze beginnt. Das sind ungefähr 40 Prozent verschwendeten Raums, alles aufgrund einer unvorsichtigen Anordnung von Elementvariablen.
Dies ist die abschließende Zeile in Fettdruck: - Lassen Sie den Compiler wertvollen Speicherplatz nicht verschwenden. Setzen Sie einige Ihrer Gehirnzellen auf arbeiten und richten Sie Ihre eigenen Mitglied Variablen.
Bitte zeigen Sie mir Berechnungen und erklären Sie das Padding-Konzept im Text deutlicher.
Code: -
#pragma pack(push, 1)
struct ReallySlowStruct
{
char c : 6;
__int64 d : 64;
int b : 32;
char a : 8;
};
struct SlowStruct
{
char c;
__int64 d;
int b;
char a;
};
struct FastStruct
{
__int64 d;
__int b;
char a;
char c;
char unused[2];
};
#pragma pack(pop)
_Es ist weder Bit-ausgerichtet noch Byte-ausgerichtet_. Bit ausgerichtet? Ich verstehe das nicht, die minimal adressierbare Adresse in C ist ein Byte, oder? –
bezogen/dupe: http://StackOverflow.com/Questions/5397447/Struct-Padding-in-C und http://StackOverflow.com/Questions/6025269/Data-Structure-Padding – NathanOliver
Siehe auch dieses Wiki: https: //en.wikipedia.org/wiki/Data_structure_alignment – NathanOliver