C语言 sizeof关键字

sizeof是C语言的一个关键字,而不是一个函数,字节数的计算再程序编译时进行,而不是在程序执行过程中。因此像int arr[sizeof(int)]这样的表达式是正确的。sizeof的功能是求一个对象或者类型所占的内存字节数。因此在win32环境中,下面的这些结果都是正确的。

char	data1;		sizeof(data1) = 1;
short	data2;		sizeof(data2) = 2;
int	data3;		sizeof(data3) = 4;
long	data4;		sizeof(data4) = 4;
float	data5;		sizeof(data5) = 4;
double  data6;		sizeof(data6) = 8;
char*	data7;		sizeof(data7) = 4;
short*	data8;		sizeof(data8) = 4;
int*	data9;		sizeof(data9) = 4;
long*	data10;		sizeof(data10)= 4;
float*	data11;		sizeof(data11)= 4;
double* data12;		sizeof(data12)= 4;

稍微复杂一点的是用sizeof求结构体所占内存大小。

程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。

对于结构体A

struct A {
	char a;
	double b;	
	int c;
};
若按4字节对齐,则sizeof(A)=16;若按8字节对齐,则sizeof(A)=24。

对于结构体重存在位域的情况,如

struct A {
	unsigned char c1:2;
	unsigned char c2:2;
	unsigned char c3:2;
	unsigned char c4:2;
	unsigned char c5:1;
};
不管按多少字节对齐,sizeof(A)=2。位域是先往一个字节中存储,如果存储满了则存储到下一个字节中,所以A中c1、c2、c3和c4存储在第一个字节中,c5存储在第二个字节中。它的默认对齐长度是1字节。


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值