union和struct的大小问题(VC与G++不同)

union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小,如:

typedef union
{
  char c[10];
  char cc1;
}u11;

typedef union
{
  char c[10];
  int i;
}u22;

typedef union
{
  char c[10];
  double d;
}u33;

sizeof(u11)结果:

  VC按照sizeof(c)分配空间为10;G++按照sizeof(c)分配空间为10。
sizeof(u22)结果:
  VC按照sizeof(int)*3分配空间为12;G++按照sizeof(int)*3分配空间为12。
sizeof(u33)结果:
  VC按照sizeof(double)*2分配空间为16;G++按照sizeof(int)*3分配空间为12。


结构体struct非配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关。如:

typedef struct s1
{
  char c;
  double d;
}s11;

typedef struct s2
{
  char c;
  char cc;
  double d;
}s22;

typedef struct s3
{
  char c;
  double d;
  char cc;
}s33;

sizeof(s11)结果是应该是9,但是:

VC 按照sizeof(double)*2分配,所以大小是16。
G++ 按照sizeof(int)+sizeof(double)分配,所以大小是12。

sizeof(s22)结果是应该是10,但是:
VC 按照sizeof(double)*2分配,所以大小是16,先分配8字节给c,c占用一个字节,剩余7字节可以存储cc,所以 VC 没有额外给cc分配内存。cc有了内存后剩余6字节无法存储d,系统就额外为d分配8字节,整个分配浪费内存6字节。
G++ 按照sizeof(int)+sizeof(double)分配,所以打消是12。

sizeof(s22)结果是应该是10,但是:
VC 按照sizeof(double)*3分配,所以大小是24,因为和定义顺序有关,所以当给c分配8个字节之后,剩余7个字节无法存储d,所以 VC 又分配了8个字节给d,之后又分配8个自己给cc,分配完后浪费了14个字节的空间。所以,在定义结构体struct 的时候按照s22的顺序分配可以节省内存。
G++ 按照sizeof(int)+sizeof(double)+sizeof(int)的方式分配,所以大小是16。

你可能感兴趣的:(C++,c,C#,vc++)