C++ 不需要结构大小的结果

C++ 不需要结构大小的结果,c++,struct,sizeof,C++,Struct,Sizeof,我有一个这样定义的结构: typedef struct _CONFIGURATION_DATA { BYTE configurationIndicator; ULONG32 baudRate; BYTE stopBits; BYTE parity; BYTE wordLength; BYTE flowControl; BYTE padding; } CONFIGURATION_DATA; 现在,据我估计,这个结构体有10字节长。但是,si

我有一个这样定义的结构:

typedef struct _CONFIGURATION_DATA {
    BYTE configurationIndicator;
    ULONG32 baudRate;
    BYTE stopBits;
    BYTE parity;
    BYTE wordLength;
    BYTE flowControl;
    BYTE padding;
} CONFIGURATION_DATA;
现在,据我估计,这个结构体有10字节长。但是,sizeof报告它有16字节长?有人知道为什么吗


我正在使用Windows DDK中的构建工具进行编译。

更改元素的顺序。以ULONG开头,后跟字节。这将改进结构在内存中的对齐。

对齐

使用

#pragma包(1)

…结构在这里…

#pragma pack()


我还建议对内容进行重新排序,如果必要的话,使用保留字节填充,这样多字节整数类型将更好地对齐。这将使CPU的处理速度更快,代码更小。

这是由于填充,因为在您的平台上,
ULONG32
显然必须在4字节边界上对齐。由于
结构的开始和结束显然也必须对齐,因此第一个和最后一个
字节将分别填充3个字节。

您测量的额外大小是编译器引入的填充


假设您使用的是32位系统,因此在
configurationIndicator
baudRate
之间会有3个字节的填充,在结构的末尾还会有3个字节的填充。

某种形式的强制对齐?请记住:结构的大小可能不等于其成员大小之和;允许实现在成员之间和最后一个成员之后插入填充。始终按名称访问成员,而不是按偏移量访问成员,因为偏移量在编译器版本和供应商之间可能会发生变化。只有在有充分理由的情况下才可以这样做——许多体系结构都不允许不对齐的访问(因此编译器必须使用字节加载和保存以确保安全),并且大多数都会带来性能损失。True。但我希望编译器在体系结构不支持时生成适当的指令来访问未对齐的整数类型。这是访问文件、通信和其他IO中的二进制数据的常见模式。相反,如果不明确指定对齐方式,我会说避免编写结构,因为它会随着编译器版本/设置的变化而变化。实际上,我之所以需要这样打包,是因为它会写入套接字,通信规范指明了一条10字节的消息。@Pavel--您可能“期望”编译器做一些事情,但不能保证它会做!例如,MS VC++交叉编译器不会自动为未对齐的类型生成指令,您必须使用用_unaligned声明的指针显式地告诉它这样做。@Pavel:我当然不会“预料”到这一点。你只是被宠坏了,因为你已经习惯了x86硬件。编写程序在一点点刺激下崩溃也是一种“常见模式”。