典型的32位计算机对于每种数据类型都有以下存储空间:
char : 8位
短: 16位
int : 32位
长: 32位
浮动: 32位
双精度: 64位
一.结构体struct
#如果没有#pragma pack宏:
三个原则:
(1)数据成员的对齐规则()原则1 ) ) )。
结构结构的数据成员。 第一个数据成员位于offset为0的位置,然后每个数据成员的开始位置以该成员大小的整数倍开始。 (例如,int在32位计算机上从4的整数倍开始存储。)
(2)以结构体为成员) )原则2 ) )。
如果一个结构同时包含结构成员,则结构成员必须从其内部最大元素大小的整数倍的地址开始存储。 例如,如果结构a包含结构b,结构b包含char、int和double元素,则b必须存储为8 (即从double大小的整数倍开始)。
(3)结构体的大小) (原则3 ) )。
也就是sizeof的结果。 在按照以往的对齐原则计算大小的基础上,必须是其内部最大成员的整数倍,必须弥补不足(例如,如果结构中最大的是双精度,当前计算的是11,则总大小是16 )。
typedef struct bb{
int id; //【0】.【3】4字节
双权重; //【8】……【15】原则1
浮动高度; //【16】……【19】如果总长是8的整数倍,那么只要凑齐,总长就会变成【0】~【19】,补充【20】……【23】。 (原则3 ) ) ) ) ) ) ) ) ) ) ) 652
(bb;
类型结构AA {
char name[2]; //【0】,【1】
int id; //【4】……【7】原则1
双内核; //【8】.【15】
短等级; //【16】,【17】
BB b; //【24】……【47】原则2、因为BB内部最大的成员是double,即从8的整数倍开始存储
(aa;
如果是:
输入主(语音) )。
{
printf(sizeof(bb ) ) dn sizeof (aa ) ) dn )、sizeof (bb )、sizeof (aa );
返回0;
}
结果如下
Sizeof(bb )=24
Sizeof(aa )=48
但是在Linux环境中,使用gcc的结果是
Sizeof(bb )=16
Sizeof(aa )=36
你觉得是为什么?
如果以上结果为没有#pragma pach(n ),现在我们来谈谈#pragmapach
2 .有2.#pragmapack(n )
#pragmapach(n )将变量设置为以n字节对齐。 其中n是1、2、4、8和16,n字节对齐可以是存储变量的第一个位置的偏移。
(1)如果n等于或大于变量所占字节数,则偏移量必须满足默认字节对齐方案,即变量所占字节数的整数倍
)如果n小于变量所占的字节数,则偏移量为n的整数倍,不需要满足默认对齐方式。
因此,结构的大小可以分为两种情况。
)1)如果n大于所有成员类型所占的字节数,则结构的总大小必须是所占区域最大变量所占区域的倍数。
)2)否则,必须是n的倍数
因此,在上面的代码中加入#pragmapack(1),得到bb:(0~3) (4~11 ) ) 12~15 )=16
aa:(0~1至1 ) 2至5 ) 6至13 ) 14至15 ) 16至31 )=32
也就是说,#pargmapack(1)是没有对齐规则的。
但是,如果添加#pragmgpack(4),则bb:(0~3) (4~11 ) ) 12~15 )=16
aa:(0~1至1 ) 4至7 ) 8至15 ) 16至17 ) 20至35 )=36
二、union共同体(联合体) )。
一些变量共享一个内存位置,在不同的世界中存储不同数据类型和不同长度的变量。 当声明一个公共体时,编译器自动生成一个变量,其长度是联合体中元类型(像素族一样取类型长度)最大变量长度的整数倍,大于或等于最大成人所占的存储空间。
例如:
union foo{
char s[10];
int i;
(;
其中,foo的内存空间长度为12,是int型数据的3倍,而不是数组的长度10。 将int更改为double时,foo的空间为16,是double的两倍。
例如:
union mm{
char a; //1字节
int b[5]; //20字节
双精度c; //8字节
int d[3]; //12字节
(;
sizeof(unionmm )=8*3=24;
另外:
在共用体包含结构体情况下,
结构inner {
char c1;
双精度d;
char c2;
];
union data4{
结构输入器t;
int i;
char c;
(;
由于data4共用体有inner结构体,因此节本数据类型为double、8字节排列。 共用体的长度取决于t,因此sizeof(uniondata4)=24
结构体中包含共用体时,共用体中的地址为在共用体自身内部对齐的位数。
类型定义单元{
龙格;
int k[5];
char c;
}日期;
结构数据{
int cat;
char cc;
日期cow;
char a[6];
(;
于是,sizeof(date ),在结构体中为4 )1)3) 4对准) 20 )6) 4对准)=36