再总结字节对齐问题

    技术2022-05-19  21

    时间:2011年4月19日   

    目的:理解结构体的字节对齐原因以及如何计算结构体所占内存大小

    心得: 踏踏实实做人,认人真真做事。 

    ---------------------------------------------------------华丽的分割线----------------------------------------------------

    首先明确一些基本概念:

    1、字节对齐的原因:字节对齐主要是考虑到计算机的读取效率;

    2、自身对齐:一般数据位sizeof(),类或者结构体为其成员元素中最大的sizeof();

    3、指定对齐:一般32位机的默认值为 4个字节,也可以自己指定对齐pragma pack(value);

    4、有效对齐:与自身对齐和指定对齐值中较小的为有效对齐;

    有了以上的概念就可以很好的理解字节对齐的问题了:

    总结起来就两句话:

    (1)元素存放的首地址可以被自身对齐整除;

    (2)结构体的整体储存空间大小能被其有效对齐整除;

    能遵守上面两条规则就可以完全掌握不同平台下面的字节对齐问题了。

     

    即三种对齐两种规则就可以把字节对齐问题全部解决!!!

     

    举例:

    #include<stdio.h> struct name { int a; char b; short c; }; int main(void) { struct name zz; printf("%d",sizeof(zz)); getchar(); getchar(); return 0; }  

    其输出结果为:8

     

    百度百科:

      其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

      1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

      2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

      3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。例如上面第一个结构体变量。

     


    最新回复(0)