Kann ein C++ - compiler erneut, um Elemente in einer struct
Kann ein C++ - compiler (speziell g++) erneut, um die internen Elemente einer struct?
Ich sehe etwas seltsames Verhalten, wo ich haben eine Struktur, die enthält so etwas wie die folgenden:
Struct SomeStruct{
...
...
long someLong;
long someLongArray[25];
unsigned long someUnsignedLong;
unsigned long someUnsignedLongArray[8];
unsigned long int someUnsignedLongInt;
...
...
};
Wenn ich Schreibe die Ausgabe dieser Datei, die Reihenfolge der someUnsignedLongArray und someLongArray scheinen rückgängig gemacht werden (d.h. die Elemente in someLongArray[] erscheinen nach someUnsignedLong und die Elemente der someUnsignedLongArray[] erscheinen nach someLong). Ist das möglich??
Dank
Update:
Wie gewünscht, Schreibe ich die Struktur mit den folgenden:
int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666);
int writeRes = write(fd,(char *)&someStruct,sizeof(SomeStruct));
Vollständigkeit halber, hier ist das komplette struct:
struct SomeStruct{
byte someByte;
byte someByteArray[6];
char someChar;
char someCharArray[5];
char someCharArrayArray[3][5];
short someShort;
signed short someShortArray[2];
unsigned short someUnsignedShort;
unsigned short someUnsignedShortArray[8];
int someInt;
int someIntArray[3];
int someIntArrayArrayArrayArray[4][3][2][6];
int *pSomeInt;
unsigned int someUnsignedInt;
unsigned int someUnsignedIntArray[9];
long someLong;
long someLongArray[25];
unsigned long someUnsignedLong;
unsigned long someUnsignedLongArray[8];
unsigned long int someUnsignedLongInt;
long long someLongLong;
long long someLongLongArray[5];
bool someBool;
bool someBoolArray[3];
unsigned long long someUnsignedLongLong;
unsigned long long someUnsignedLongLongArray[5];
unsigned long long someUnsignedLongLongArrayArray[5][2];
unsigned long long int *pSomeUnsignedLongLongInt;
};
- Wie schreibst du das struct in eine Datei?
- Sind Sie sicher, dass Sie sehen, was Sie glauben, was Sie sehen? dh Sie haben geschrieben, eindeutigen bit-Muster in jedem element und trace können Sie auf die Datei? Auch was #pragma pack (wenn überhaupt) benutzt du um die struct?
- Vielleicht hat er das schreiben der bytes der Struktur, anstatt die Elemente der struct, in die Datei.
- Können Sie ersetzen die "..." und schreiben Sie eine main-Funktion, die Exponate zu dem Thema? Es macht einen Unterschied, was sonst noch in die struct, und wie Sie, Sie schreiben es in eine Datei. Hast du cast SomeStruct* zu char* und schreiben, sizeof(SomeStruct) bytes, oder etwas anderes?
- Btw: Sie können die Reihenfolge der Felder mit offsetof, ohne das schreiben etwas auf der Festplatte.
- Hinzugefügt Frage...
- Und Sie führen diesen code auf einer x86 CPU? Unter endian Typ in Betracht, es ist in der Regel besser zu schreiben, die jedes element einer Struktur zu einer Zeit (unter Verwendung geeigneter hton()-Makros) wenn Sie möchten, dass Ihr code portabel sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es in der Regel nicht neu anordnen Elemente, keine.
Eine Ausnahme ist wenn es ein zugriffsspezifizierer, die Sie trennt:
a
,b
undc
garantiert gespeichert werden, in dieser Reihenfolged
,e
undf
garantiert werden gespeichert, um. Aber es gibt keine Garantien darüber, woa
,b
undc
gespeichert sind, die relativ zud
,e
undf
.Andere Sache im Auge zu behalten ist, daß der compiler legen Sie so viel Polsterung wie es mag, auch wenn es nicht alles neu ordnen.
Hier ist der relevante Teil der standard:
Abschnitt 9.2.12:
Kann es nicht finden Automatisierte Feld neu Sortieren in C structs zu vermeiden, Polsterung und Warum nicht den GCC optimieren, Strukturen? für weitere Informationen.
Ich weiß nicht, was meinst du mit "Umgekehrt", sollten Sie vielleicht fügen Sie einige code und die Ausgabe.