当前位置:C++技术网 > 资讯 > 关于结构体内存分配对齐深入理解

关于结构体内存分配对齐深入理解

更新时间:2015-06-26 14:54:00浏览次数:1+次

    比如:(32位系统下)
struct a
{
    int b;
    double c;
    char d[9];
};
void main()
{
    prinf("%d",sizeof(struct a));
}

    如果按照“结构体变量占据的内存单元的个数应当大于等于其内部所有数据成员占据内存单元数的和。”这句话来理解输出就是int占了4个字节,double占用8个字节,char定义一个数组占用了9个字节所以总用21个字节,但是结果不是这样。
    接下来我来解释一下原因:
    首先要知道出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则:
    (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除;
    (2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
    (3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
    (所谓基本类型是指像char、short、int、float、double这样的内置数据类型。“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型)
    看完这个我来再看上面那段代码
struct a
{
    int b;/*本身占用4个字节,但是因为下面最宽数据类型是double,要让它整除,所以占用8个字节,编译器自动对齐(参考第一点)*/
    double c;/*这个就是最宽数据类型,占用字节就是它本身8个字节*/
    char d[9];/*本身每个char占用1个字节,定义了9个char所以大家认为一共用9个字节,但是其实是16个字节,因为要被double整除(参照第二点)*/
};
void main()
{
    prinf("%d",sizeof(struct a));//所以最后输出为32
}

    为什么编译器要这样做,其实就是为了提高程序的效率,对齐后使得每一个字节步长都一样,系统执行起来速度就会加快
    本人也是初学者所以用最简单的C语言来解释了,有错误的地方希望大神来指数,本人不甚感激。