【发布时间】:2025-12-03 07:40:01
【问题描述】:
C++ 编译器(特别是 g++)可以重新排序结构的内部元素吗?
我看到一些奇怪的行为,我的结构包含以下内容:
Struct SomeStruct{
...
...
long someLong;
long someLongArray[25];
unsigned long someUnsignedLong;
unsigned long someUnsignedLongArray[8];
unsigned long int someUnsignedLongInt;
...
...
};
当我将输出写入文件时,someUnsignedLongArray 和 someLongArray 的顺序似乎颠倒了(即 someLongArray[] 中的元素出现在 someUnsignedLong 之后,而 someUnsignedLongArray[] 的元素出现在 someLong 之后)。这可能吗??
谢谢
更新: 根据要求,我正在使用以下内容写出结构:
int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666);
int writeRes = write(fd,(char *)&someStruct,sizeof(SomeStruct));
为了完整起见,这里是完整的结构:
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;
};
【问题讨论】:
-
如何将结构写入文件?
-
你确定你看到的是你认为你看到的吗?即,您是否在每个元素中写入了独特的位模式并可以将它们跟踪到文件中?还有你在结构周围使用什么#pragma pack(如果有的话)?
-
也许他正在将结构的字节而不是结构的元素写入文件。
-
你可以替换“...”并编写一个显示问题的主函数吗?结构中的其他内容以及如何将其写入文件会有所不同。您是否将 SomeStruct* 转换为 char* 并写入 sizeof(SomeStruct) 字节或其他内容?
-
顺便说一句:您可以使用 offsetof 检查字段的顺序,而无需将任何内容写入磁盘。