怎么计算union和struct中字节数计算

来源:互联网 发布:gbk转utf8 linux 编辑:程序博客网 时间:2024/05/30 22:52

首先我的运行结果都是在64位系统的Xcode中运行的!

然后,这个只是由于对于标准的位移量方法看得头疼,自己总结出来的,如果有错误或者不明欢迎留言!

字节:一般成8位为一个字节,在Xcode中sizeof(int)等于4,在这里也就采用int占用4个字节的说法!

typedef union {    long i;int k[5];char c;}DATE;
union,百科上称之为联合,我这种直入OC的小白今天没有接触过!似乎是为了节省内存而诞生的关键字.

大体上union的结构和struct结构体类似,不同的是同一时刻union中只会存放一个成员,一旦对另一个成员赋值,原来那个成员就会被覆盖!

而结构体支持同时对内部成员多个赋值,当然代价是内存!

要计算union的大小,首先要找到占用字节最多的成员,本例中是long,占用8个字节,int k[5]中都是int类型,仍然是占用4个字节的,

然后union的字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员,

为了要容纳k[5](20个字节),就必须要保证是8的倍数的同时还要大于20个字节,所以是24个字节!

所以这个union占用内存大小为24个字节!

struct date{    int cat;//4    int s;    DATE cow;//24    double dog;//8}too;
对于结构体,规则类似,首先要找出其占用字节数最长的成员,注意这里不是DATE cow,而是double dog或者说是union中的long i!

所以里面占有字节数最长的成员的字节数为8个字节!

当里面有其他类型的时候需要将其先拆封!然后再计算大小!

然后按照上面的规则,首先是int cat占用4个字节,不足8个字节,不是8的倍数,所以补足到8个字节,

是否需要补足看下一个成员的类型是否是占用最大字节数的类型,是就需要对前面字节补足,对于后面的字节数一样!

然后是int s也是不足8个字节,这里可以纳入前面空余的4个字节,一起构成8个字节!

然后DATE cow占用24个字节,一起32个字节,是8的倍数,不用补字节!

最后是double dog,也是8个字节,一起加起来40个字节!刚好是40个字节!

所以这个结构体大小为40个字节!

在这个结构体中如果没有int s,针对int cat计算,只有4个字节,不是8的倍数,所以需要补足到8个字节,所以大小还是40个字节!

如果有int s则在任意位置加入一个char成员,那么都要增加8个字节!

1 0