C当中关于sizeof(struct)和sizeof(union)
来源:互联网 发布:c语言while循环的用法 编辑:程序博客网 时间:2024/05/21 11:25
char:8位
short:16位
int:32位
long:32位
float:32位
double:64位
一、接下来先来看struct,结构体
请牢记以下3条原则:(在没有#pragma pack宏的情况下)
1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。
2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。
3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍,不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。
具体例子:
typedef struct bb{int id; //[0]....[3] 表示4字节double weight; //[8].....[15] 原则1float height; //[16]..[19],总长要为8的整数倍,仅对齐之后总长为[0]~[19]为20,补齐[20]...[23] 原则3}BB;
typedef struct aa { int id; //[0]...[3] 原则1 double score; //[8]....[15] short grade; //[16],[17] BB b; //[24]......[47] 原则2(因为BB内部最大成员为double,即8的整数倍开始存储) char name[2]; //[48][49]}AA;
int main(){cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;return 0;}输出结果为56 24
以上结果是在没有#pragma pack(n)宏的情况下,现在来讲讲关于#pragma pack(n)。
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。//n为1、2、4、8、16...
n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,即该变量所占用字节数的整数倍;第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
所以在上面的代码前加一句#pragma pack(1),
则代码输出为bb:(0~3)+(4~11)+(12~15)=16;aa:(0~1)+(2~5)+(6~13)+(14~15)+(16~31)=32,也就是说,#pragma pack(1)就是没有对齐规则。
再考虑#pragma pack(4),bb:(0~3)+(4~11)+(12~15)=16;aa:(0~1)+(4~7)+(8~15)+(16~17)+(20~35)=36
二、union共用体(联合)
union foo{char s[10];int i;}
union mm{ char a;//元长度1 1 int b[5];//元长度4 20 double c;//元长度8 8 int d[3]; 12 };所以sizeof(mm)=8*3=24;
struct inner{ char c1; double d; char c2; };union data4{ struct inner t1; int i; char c; };由于data4共用体中有一个inner结构体,所以最大的基本数据类型为double,因此以8字节对齐。共用体的存储长度取决于t1,而t1长度为24,因此sizeof(uniondata4)的值为24.
当在结构体中包含共用体时,共用体在结构体里的对齐地址为共用体本身内部所对齐位数,如下:
typedef union{long i;int k[5];char c;}DATE;struct data{int cat;char cc;DATE cow;char a[6];};
- C当中关于sizeof(struct)和sizeof(union)
- C当中关于sizeof(struct)和sizeof(union)
- C当中关于sizeof(struct)和sizeof(union)
- C当中关于sizeof(struct)和sizeof(union)
- C当中关于sizeof(struct)和sizeof(union)计算
- sizeof(struct)和sizeof(union)
- sizeof union和struct
- C语言中的sizeof(struct )和sizeof(union)
- c语言中sizeof struct和sizeof union
- C语言sizeof(struct)与sizeof(union)
- 关于sizeof 和struct
- sizeof(struct)与sizeof(union)
- 《C关键字分析》之sizeof,enum、union和struct
- sizeof struct&union
- union, struct , sizeof. 对齐
- union 和struct的sizeof问题
- Struct和Union的sizeof计算
- struct union数据对齐和sizeof大小
- 【折腾ubuntu】Ubuntu12.04安装windows版本的福昕阅读器
- UItextfield输入不了任何字符的解决办法
- centos下yum安装RabbitMQ[最顺利的一次]
- Ubuntu下使用摄像头
- java对日期的操作详解
- C当中关于sizeof(struct)和sizeof(union)
- JavaOne上海2013进展:50+场讲座等
- 在 Google 做实习生是什么样的
- cocos2d-x eclipse bash not found
- 总结多态的重点
- jsp写入mysql数据库中文乱码解决方案
- C# WPF WebBrowser 屏蔽页面错误
- SPI接口目录
- 漫谈IC卡之---结识有缘