如何简单地获取属于这样结构的数据成员的sum
大小:
(包括数据成员之间的填充但不,包括结构之间的填充)?
#pragma pack(4)
alignas(16) struct {
char c[4];
short s;
unsigned char u[3];
} MyStruct;
下面的表达式正确计算了这个总和,但很难构造,因为它需要了解成员名称,类型及其顺序:
printf("%zu\n", &MyStruct.u[3] - &MyStruct.c[0] ); //Outputs: 11
下面的表达式不正确计算此总和,因为它还计算维持对齐所需的结构间填充(如果许多此类结构需要 所需的填充被放入一个数组中。)
printf("%zu\n", sizeof(MyStruct) ); //Outputs: 16
我意识到,后者是设计的,因为它有利于指针算术。此外,C ++文档指出:
“当应用于结构/类类型时,sizeof()的结果是该结构/类的对象的大小加上将此类对象放入数组所需的任何其他填充。”
然而,sizeof()
的这种行为使我在处理单个非阵列结构时无用,特别是在计算通过网络传输的字节数时,如果我不想传输 inter-structure padding bytes ...而我没有!
注意,传输成员间填充不会打扰我,因为此填充是网络协议的一部分。协议设计者可以随时用#pragma pack(1)
消除这种成员间填充(如果他们这样做,那么第一个printf()会输出:9)