经常听说字节对齐,那什么是对齐?

描述

在计算结构体长度的时候,我们经常听说字节对齐。那什么是对齐?
 如果一个变量在内存中的地址正好是它长度的整数倍,我们就称它为自然对齐。
 比如在32位的操作系统中,如果一个整型变量的地址是0x04,那么它就是自然对齐。
 操作系统而且操作系统也确实是这么做的,随便定义一个整型变量,打印它的地址,结果一定是4的倍数。
int main()
{
    int num;
    printf("%p
", &num);
    return 0;
}
 这样做的根本原因还是为了提高CPU的访问效率。如果一个整型变量存放在0x02地址上,那么CPU首先会读取两个字节的short,再读取后面的两个字节,最后把两个部分合成一个整数,很显然这样的效率会比较低。
 操作系统  有了这个基础,我们再来计算结构体的长度,就会简单的多。
struct Test
{
    char ch;
    int num;
    short id;
    char c;
};
 比如这个结构,char类型占一个字节,int占四个字节,但是num不能直接跟在ch的后面,否则num的地址肯定不是4的整数倍,所以需要在ch的后面空3个字节。
 操作系统
   接下来轮到id,在32位系统中short占2个字节,直接跟在num的后面就行。

 操作系统

 最后一个是c,因为只占一个字节,所以直接放在最后就好。

 操作系统  那结构体的长度是不是11个字节呢,不是的,结构体的长度一定是最长成员的整数倍,所以在c的后面还空了一个字节,结构体一共占了12字节。
 记住几个原则。
 一、结构体变量的首地址是最长成员长度的整数倍。比如我们计算的这个结构体,它的首地址一定是4的整数倍。
 二、每个成员相对结构体首地址的偏移量,一定是该成员长度的整数倍。
 三、结构体的总长度是最长成员长度的整数倍。
 

四、如果结构体内有成员长度大于处理器的位数,那么就以处理器的位数作为对齐单位,比如在32位操作系统中,double占8字节,我们还是按照4字节为对齐单位。

 操作系统
   

 

审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分