包含unsigned char和int bug的C++ struct

pow*_*ear 5 c++ byte struct

好的,我的C++程序中有一个结构,如下所示:

struct thestruct
{
 unsigned char var1;
 unsigned char var2;
 unsigned char var3[2];
 unsigned char var4;
 unsigned char var5[8];
 int var6;
 unsigned char var7[4];
};
Run Code Online (Sandbox Code Playgroud)

当我使用这个结构时,在"var6"之前添加3个随机字节,如果我删除"var5"它仍然在"var6"之前,所以我知道它总是在"var6"之前.

但是,如果我删除"var6",那么3个额外的字节就消失了.

如果我只使用带有int的结构,则没有额外的字节.

所以unsigned char和int之间似乎存在冲突,我该如何解决?

Gre*_*ill 6

编译器可能正在使用其默认对齐选项,其中x大小的成员在可被x整除的内存边界上对齐.

根据您的编译器,您可以使用#pragma指令来影响此行为,例如:

#pragma pack(1)
Run Code Online (Sandbox Code Playgroud)

将关闭Visual C++中的默认对齐方式:

指定要用于打包的值(以字节为单位).n的默认值为8.有效值为1,2,4,8和16.成员的对齐将位于边界上,该边界是n的倍数或成员大小的倍数,以较小者为准更小

请注意,出于低级CPU性能原因,通常最好尝试对齐数据成员,使它们落在对齐的边界上.某些CPU架构需要对齐,而其他(例如Intel x86)则容忍未对准而性能下降(有时非常显着).


Mic*_*nen 5

您的数据结构是对齐的,以便您的int落在单词边界上,对于您的目标可能是32位或64位.
您可以像这样重新组织您的结构,以便不会发生这种情况:

struct thestruct
{
 int var6;
 unsigned char var1;
 unsigned char var2;
 unsigned char var3[2];
 unsigned char var4;
 unsigned char var5[8];
 unsigned char var7[4];
};
Run Code Online (Sandbox Code Playgroud)