结构体字节对齐

462 阅读2分钟

结构体字节对齐

在定义结构体时,会发现结构体的大小有时是成员的字节大小相加,有时候又比成员的字节数相加大。这就涉及字节对齐问题。在访问内存时,是以4个字节或8个字节一次访问的,这样访问效率高。在结构体时会出现其他的数据大小,这时就要字节对齐,浪费一些空间,凑成4或8的整数倍。

程序解释

struct p1
{
    char c;
}p1;
struct p2
{

}p2;
struct p3
{
    char c;
    int age;
}p3;
struct p4
{
    char c;
    int age;
    double score;
}p4;
int main(void)
{
    printf("char\tshort\tint\tfloat\tdouble\t\n");
    printf("%d\t%d\t%d\t%d\t%d\t\n",sizeof(char),
           sizeof(short),sizeof(int),sizeof(float),
           sizeof(double));
    //sizeof(student);
    printf("p1: %d\n",sizeof(p1));
    printf("p2: %d\n",sizeof(p2));
    printf("p3: %d\n",sizeof(p3));
    printf("p4: %d\n",sizeof(p4));
    return 0;
}

结果

//32位平台结果
char    short   int     float   double
1       2       4       4       8
p1: 1
p2: 0
p3: 8
p4: 16

可以看到空结构体的大小为0,单个成员的结构体大小为本身字节大小。多个成员的字节大小需要分析。结构体中的大小为成员里面的字节数最大的整数倍,p3中,int类型最大,p3结构体大小为8。p4中,double最大,p4结构体大小为16。

案例分析
案例分析
总结:结构体大小为内部字节数最大成员的字节数的整数倍,结构体嵌套也一样。基本数据类型在内存中存储是连续的,不可分割。所以在结构体中会存在内存浪费。

结构体优化

struct student1
{
    int age;
    double score;
    char name[20];
}student1;

struct student2
{
    int age;
    //注意位置调换
    char name[20];
    double score;
}student2;

int main(void)
{
    printf("char\tshort\tint\tfloat\tdouble\t\n");
    printf("%d\t%d\t%d\t%d\t%d\t\n",sizeof(char),
           sizeof(short),sizeof(int),sizeof(float),
           sizeof(double));
    printf("student1: %d\n",sizeof(student1));
    printf("student2: %d\n",sizeof(student2));

    return 0;
}

结果

char    short   int     float   double
1       2       4       4       8
student1: 40
student2: 32

可以看到,同样的成员,但是位置不同,造成占用的的内存不一样。知道字节对齐后,可以通过调整成员顺序来优化内存。

字节优化
介绍到此结束
微信号