如何简单地获得属于结构的数据成员的大小总和?

时间:2018-04-05 23:05:17

标签: c++ visual-studio-2017

如何简单地获取属于这样结构的数据成员的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)

0 个答案:

没有答案