C 字节对齐

情况1:
typedef struct Test
{
char a;
char b;
char c;
}Test;
typedef是重定义关键字 ,如果没有typedef关键字声明时加struct关键字,若有,声明时不需要加struct关键字。struct后面的Test是定义的类型名;若无Test,说明是匿名的。大括号之后的Test是定义的变名,可初始化。
上面程序中结构体的大小为3字节,因为结构体中的类型都是同类型 char, char的大小为1字节。所以加起来就是3个字节。
情况2:
typedef struct Test
{
char a; //1 + 7
double b; //8
int c; //4 +4
}Test;
此时,结构体中的类型最大的双精度(double)类型,字节数为8,且处于中间,所以char类型要不起7个字节,int类型要补齐4个字节。则总共24个字节。
情况3:
typedef struct Test
{
char a; //1 +1
short c; //2
double b; //8
}Test;
此时,结构体第一个类型是char,第二个是short类型,占2个字节,所以char要补齐一个字节。此时前两个字节共4个字节,第三个类型是double,占8个字节,所以前两个要再补齐4个字节。所以共占16个字节.
情况4:
/*
#pragma pack(1)
typedef struct Test
{
char a; //1
short b; //2
double c; //8
}Test;
#pragma pack(1)标明以1个字节对齐,所以将此结构体内的类型加起来就是其的大小,为11。
情况5:
typedef struct Test
{
short a; //2+6
struct //24
{
int b; //4 + 4
double c; //8
char d; //1 + 7
};
long e; //4 + 4
}Test;
先看结构内部的自定义类型的大小。第一个是int类型4个字节,第二个是double类型占8个字节,第三个是char类型,所以第一个类型要向double对齐所以补齐4个字节,同理第三个要补齐7个字节。所以整个自定义类型的大小为24个字节。但是若要与结构体Test中其他类型对齐,则自定义类型的大小要按照内部最大的类型来比较,所以此时short类型是2个字节,与自定义类型中double类型8个字节对齐,要补齐6个字节。同理long类型要补齐4个字节,所以结构体的大小为40(8+24+8)个字节。
情况6:
#pragma pack(4)
typedef struct Test
{
short a; //2+2
struct t
{
int b; //4
double c;//8
char d; //1+3
}tt;
long e;//4
}Test;
#pragma pack(4)表明程序中要以4个字节对齐,同样,先看结构体t中,int类型4字节,double类型8个字节,是4的倍数;char类型是1个字节所以要补齐3个字节;所以结构体t是16个字节,short类型是2个字节,要补齐2个字节,long类型是4个字节;所以全部加起来是24个字节。特别注意struct t结构体定义了tt变量说明开辟了空间,所以要占字节数。如果没有定义变量tt,则说明是一个类型,不占大小空间,相当于不存在,可以不考虑;此时结构体Test的大小为8个字节。例如:
typedef struct Test
{
short a; //2+2
struct t //此时是一个类型,不占大小空间,相当于不存在,所以不考虑;
{
int b; //4
double c;//8
char d; //1+3
};
long e;//4
}Test;
情况7:
typedef struct Test
{
}Test;
此时,结构体内什么类型都没有,即空结构体,占1个字节。
情况8:
typedef struct Test
{
char a : 3;
char b : 2;
char c : 1;
}Test;
此时要考虑位域。: 表示位域;a : 3表示占1个字节的3个比特位;b : 2表示占1个字节的2个比特位,同理c : 1占1个比特位。 加起来6个比特位,不足一个字节8个比特位。所以此时仅占1个字节。
但是存在限制,如果结构体中再添加一个 char d : 3; 此时共占9个比特位,超过了1个字节。所以此时会占2个字节。但是再存储空间位置不相同,前三个占1个比特,后一个占1个比特,说明位域不跨字节存储。
typedef struct Test
{
char a : 3; //1 + 3
int b : 2; //4
}Test;
此时占8个字节。注意:不跨字节存储,也不跨类型存储。char类型中的3个比特占1个字节,int类型中的2个比特占4个字节。然后进行字节对齐,char类型补齐3个字节。所以共4个字节。

例题:
void main(int argc, char *argv[])
{
char *pcColor = “CSOFTX3000”; //“Hello”
char acColor[] = “CSOFTX3000”;
cout<<strlen(pcColor)<<endl; // 10
cout<<strlen(acColor)<<endl; // 10
cout<<sizeof(pcColor)<<endl; // 4
cout<<sizeof(acColor)<<endl; // 11
}

#pragma pack(4)

unsigned short *pucCharArray[10][10];
typedef union unRec
{
unsigned long ullndex; //2 + 2
unsigned short usLevel[7]; //7 + 1
unsigned char ucPos; 1 + 3
}REC_S;

REC_S stMax, *pstMax;

void main()
{
cout<<sizeof(pucCharArray)<<endl;//400
cout<<sizeof(stMax)<<endl; //16
cout<<sizeof(pstMax)<<endl; //4
cout<<sizeof(*pstMax)<<endl; //16
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值