sizeof

sizeof 返回一个对象或者类型名的长度,返回值的类型为size_t,其结果是编译时常量。


1 所有的指针大小同等于机器字长

2 int 在32位和64位上一般是4字节。long 同等于机器字长。

3 sizeof不对表达式进行运算,只取表达式结果的类型长度

 int a[] = {1,2,3}; char *t = NULL; const char *p = "123"; int k1 = 0; int k2 = 1;

sizeof(a) = 12;

sizeof(*t) =  1; 

sizeof(p) = 4;

sizeof( k2 = k1)  = 4 此时k2的值依旧是1.

4 结构体含有多个对象时,需要字节对齐。每个编译器都有默认的对齐系数k,gcc默认为4,VC默认为8.每种数据类型都有自身的对齐大小s,即其自身的大小,最后整个结构体也要对齐。结构内的成员对齐是指数据成员的地址应当和min(k,s)对齐。整个结构体的大小应该和所有的结构体大小中最大的那个,与k两者最小的哪个对齐。

比如:

假设对齐系数k=4

struct T {

int a; // 长度为4,起始地址0%sizeof(int)= 0, [0,3]

char b; //长度为1,起始地址4 %(sizeof(char)) = 0, [4]

 short c; //长度为2,, 起始地址5%sizeof(shor) !=0,对齐为 6, 存放地址为[6,7]

}; 

整体的长度此时为8, min(max(int,char,short), k) = 4,最终对齐为8.

再如:

对齐系数k=8时,

struct T2 {

char b; //长度为1,起始地址0 %(sizeof(char)) = 0, [0]

double a; // 长度为8,起始地址1%sizeof(double) != 0,对齐为8, [8,15]

 short c; //长度为2,, 起始地址15%sizeof(shor) !=0,对齐为 16, 存放地址为[16,17]

}; 

此时结构体长度为18,不能对齐,min(max(int,char,short), k) = 8, 最终对齐为24.


上述结构体k=4时:

struct T2 {

char b; //长度为1,起始地址0 %(sizeof(char)) = 0, [0]

double a; // 长度为8,自身对齐系数为min(k,8) = 4, 起始地址1%4 != 0,对齐为4, [4,11]

 short c; //长度为2,, 起始地址12%sizeof(shor) =0, 存放地址为[12,13]

}; 

此时结构体长度为14,不能对齐,min(max(int,char,short), k) = 8, 最终对齐为16.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值