好的,我的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之间似乎存在冲突,我该如何解决?
编译器可能正在使用其默认对齐选项,其中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)则容忍未对准而性能下降(有时非常显着).
您的数据结构是对齐的,以便您的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)