c/c++ sizeof总结

偏移量:指的是结构体变量中成员的地址和结构体变量地址的差。
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.
0被认为是任何数的整数倍

求结构体大小的2个原则:
1.偏移量为该成员大小的n倍.
2.总大小必须为最大成员大小的n倍.

用偏移量计算
struct s1
{       
 char a;//0
 int b;//1 4
 char c;//8
};//9
12
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1 4(1不是4的倍数所以,需要1 + 3)
c 的偏移量 为8
总大小为8+1 = 9
以上满足第一个条件.
第二个条件:9不是4的倍数,所以9+3
最后结果:12

struct s2
{
 char a;//0
 char b;//1
 int c;//2
};//6
8
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1
c 的偏移量 为2
总大小为2+4 = 6
以上满足第一个条件.
第二个条件:6不是4的倍数,所以6+2
最后结果:8

struct s3
{
 int a;//0
 char b;//4
 short c;//5 6
 double d;//8
 int f;//16
}s3;//20
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
d 的偏移量 为8
f 的偏移量 为16
总大小为16+4 = 20
以上满足第一个条件.
第二个条件:20不是8的倍数,所以20+4
最后结果:24

在结构体中包含有结构体,将结构体中最大成员大小作为整除。
struct s1
{       
 char a;
 int b;
 char c;
};//12

struct s2
{
 char a;//0
 s1 s;//1 4
 char b;//16
 int c;//17
};//21
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
s 的偏移量 为1 4(s1中最大成员字节数为4,所以应把4作为除数,1不是4的倍数,所以需要1+3)
b 的偏移量 为16 (s1的整体占字节数为12个,所以偏移量为4+12)
c 的偏移量 为17
总大小为17+4 = 21
以上满足第一个条件.
第二个条件:21不是4的倍数,所以21+3
最后结果:24

struct s3
{
 int a;//0
 char b;//4
 short c;//5 6
 s2 ss;//8
 double d;//32
 int f;//40
}s3;//44
//48
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
ss 的偏移量 为 8
d 的偏移量 为32 (8 + 24)
f 的偏移量 为40
总大小为40+4 = 44
以上满足第一个条件.
第二个条件:44不是8的倍数,所以44+4
最后结果:48

各种sizeof求大小的面试题。
http://blog.csdn.net/wangshihui512/article/details/9116051#comments

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值