AC_Quester's Blog » 转载:关于union和struct的内存分配

union的大小为其内部所有变量的{zd0}值,按照{zd0}类型的倍数进行分配大小
如:
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)结果是10
sizeof(u22)结果是12,按照sizeof(int)*3分配空间
sizeof(u33)结果是16,按照sizeof(double)*2分配空间。

结构体struct非配方法类似,也是按照{zd0}类型的倍数进行分配大小,但是还与顺序有关
如:
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,但是系统按照sizeof(double)*2分配,所以大小是16

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

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

转载自:hi.baidu.com/snake4/blog/item/1cbc14e9a2036438b80e2dd2.html

留下评论

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

郑重声明:资讯 【AC_Quester's Blog » 转载:关于union和struct的内存分配】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——