sizeof和结构体

 
可以按1,2,4,8字节对齐.
如果结构体中一个变量的sizeof小于默认的字节对齐,就按这个变量的sizeof,如果这个变量的sizeof大于默认的字节对齐数,就按默认的这个字节对齐数,比如默认是4字节,double型大于4,则这里按4对齐.
设N是编译器实际的字节对齐数,比如开始设定的编译器的字节对齐为4,在计算过程中有可以N=2,但是不可能大于默认的4
 
struct MyStruct
{
    char a;
    double b;
    int c ;
    short d ;
};
// 4字节对齐
int duan2 = sizeof(MyStruct) ;//
duan2 = offsetof(MyStruct,a) ;//0
duan2 = offsetof(MyStruct,b) ;//4.这里不是8.因为默认是4字节,8已经超过4了,所以就n=4
duan2 = offsetof(MyStruct,c) ;//12
duan2 = offsetof(MyStruct,d) ;//16
所以共18个,但是这里是4字节(就是编译器中制定的对齐字节)对齐,所以=20
//8字节对齐
int duan2 = sizeof(MyStruct) ;//
duan2 = offsetof(MyStruct,a) ;//0
duan2 = offsetof(MyStruct,b) ;//8
duan2 = offsetof(MyStruct,c) ;//16
duan2 = offsetof(MyStruct,d) ;//20
共22,但是是8字节对齐,所以24
//2字节对齐
int duan2 = sizeof(MyStruct) ;//
duan2 = offsetof(MyStruct,a) ;//0
duan2 = offsetof(MyStruct,b) ;//2
duan2 = offsetof(MyStruct,c) ;//10
duan2 = offsetof(MyStruct,d) ;//14
共16,但是是2字节对齐,所以16
//1字节对齐
int duan2 = sizeof(MyStruct) ;//
duan2 = offsetof(MyStruct,a) ;//0
duan2 = offsetof(MyStruct,b) ;//1
duan2 = offsetof(MyStruct,c) ;//9
duan2 = offsetof(MyStruct,d) ;//13
共15,但是是1字节对齐,所以15
 
 
 
 
struct MyStruct
{
    char a;
    short d ;
};
//还是默认4字节对齐
duan2 = offsetof(MyStruct,a) ; //0 
duan2 = offsetof(MyStruct,d) ;//2.因为2<4,所以这里是2.因为2没超过默认的4字节
最后的总和=4是默认4字节的倍数
//
如果这里是1字节对齐的话
a 放在0处
d 放在1处,因为这里是1字节对齐,所以这里2>1,所以取1,不能超过编译器默认字节对齐数
最后 = 3,是1的倍数
// 默认8字节
duan2 = offsetof(MyStruct,a) ; //0 
duan2 = offsetof(MyStruct,d) ;//2.因为2<8,所以这里是2,所以N=2
共4,4不是8的倍数,所以补足到8
 
struct {char a; char b;} T;
//8字节
a在0上
b在1上.因为1<8,所以这里N=1,
共=2,2能被1整除,所以sizeof=2
//默认4字节时
a在0
b在1上,1<4,所以n = 1
共2,2能被n整除
 
 
struct {char a; int b;} T;
//默认8字节
a在0
b在4, 4<8,N = 4
共= 8 ,8是4的倍数
如果这里加short c的话,即struct{char a ;int b ;short c ;} T
c在8上,N还是=4
共=10,10不能被4(这时的4已经不是编译器开始时制定的对齐数了)整除,所以sizeof=12,而不是=8的倍数16
 
总结:编译器开始制定的字节对齐数N,这个N在过程中可能会被改变.那每个变量的sizeof和系统指定的N比较,如果<N,则N=较小的这个,如果>N,则N还是=N,
最后的结果是否能整除就看这个N,所以这个N可能已经被改变
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值