sizeof()就结构体字节大小,字节对齐问题!如下题:
structA{chart;intk;chari;doublem;};sizeof(A)=24另一种写法:structA{intk;chart;chari;doublem...
struct A
{
char t;
int k;
char i;
double m;
};
sizeof(A)=24
另一种写法:
struct A
{
int k;
char t;
char i;
double m;
};
sizeof(A)=16;
按8字节对齐,只是调动了一下int k的顺序就变了,为什么不都是16呢?求解,int占4字节,double占8字节,char占1字节。 展开
{
char t;
int k;
char i;
double m;
};
sizeof(A)=24
另一种写法:
struct A
{
int k;
char t;
char i;
double m;
};
sizeof(A)=16;
按8字节对齐,只是调动了一下int k的顺序就变了,为什么不都是16呢?求解,int占4字节,double占8字节,char占1字节。 展开
1个回答
2013-08-07
展开全部
第一种情况:24
1 + (7) + 4 + 1 + (3) + 8
解释: 1 : char t
(7):因为这个结构体中最长的是double,占8位,所以补7位
4:int k
1 : char i
(3):这里涉及到一种规则,成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
这里补空要么按自身对齐需要补空,要么按最大长度补空,这也是第一个char为什么补7,这里补三,因为int占四位,不需要补,后面紧接一个char,而它们加起来已经占5为,最长8,所以补3,
8:double m;
第二种:16
4 + 1 + 1 + (2) + 8
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。
1 + (7) + 4 + 1 + (3) + 8
解释: 1 : char t
(7):因为这个结构体中最长的是double,占8位,所以补7位
4:int k
1 : char i
(3):这里涉及到一种规则,成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
这里补空要么按自身对齐需要补空,要么按最大长度补空,这也是第一个char为什么补7,这里补三,因为int占四位,不需要补,后面紧接一个char,而它们加起来已经占5为,最长8,所以补3,
8:double m;
第二种:16
4 + 1 + 1 + (2) + 8
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询