您的位置:首页 > 编程语言 > C语言/C++

C语言 sizeof关键字

2015-12-20 18:38 281 查看
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字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: