[044]C语言基础-结构体对齐

2020-03-23  本文已影响0人  王小二的技术栈

一、什么是结构体对齐?

1.1 废话不多说,先来个代码

#include<stdio.h>

struct A
{
    char name;
    double age;
    char sex;
};

struct B
{
    char name;
    char sex;
    double age;
};

int main(int argc, char *argv[]) {
    printf("char->%d\n", sizeof(char));
    printf("double->%d\n", sizeof(double));
    printf("A->%d\n", sizeof(struct A));
    printf("B->%d\n", sizeof(struct B));
    return 0;
}

1.2 运行结果

char->1
double->8
A->24
B->16

1.3 疑问

为什么A和B的sizeof值不一样,明明都是两个char和一个double,不应该是1+1+8 = 10嘛?

其实就是c语言结构体对齐搞的鬼

二、为什么会这样子?

2.1 修改代码

#include<stdio.h>

struct A
{
    char name;
    double age;
    char sex;
} a;

struct B
{
    char name;
    char sex;
    double age;
} b;


int main(int argc, char *argv[]) {
    printf("a.name->%d\n", &a.name);
    printf("a.age->%d\n", &a.age);
    printf("a.sex->%d\n", &a.sex);
    printf("A->%d\n", sizeof(struct A));

    printf("b.name->%d\n", &b.name);
    printf("b.sex->%d\n", &b.sex);
    printf("b.age->%d\n", &b.age);
    printf("B->%d\n", sizeof(struct B));
    return 0;
}

2.2 运行结果

a.name->170442768
a.age->170442776
a.sex->170442784
A->24
b.name->170442792
b.sex->170442793
b.age->170442800
B->16

2.3 内存示意图

我们已经可以从图中看出两个结构体在内存的存放格式了。


三、结构体对齐的好处

3.1 cpu读取一次能读取多少数据?

要看数据总线是多少位,如果是32位,则可以读取4个字节,如果是64位,则可以读取8个字节,并且cpu不能跨内存区间访问。

3.2 提升读取效率

结构体对齐的好处就是一次cpu的读取数据就可以完成一个变量的读取。

举个例子:

上述结构体A如果按照下面这样子对齐,我的电脑还是64位,这样子你会发现age这个double的变量(绿色部分)需要cpu读取两次才能完成读取。这样子不就是浪费时间了吗,所以结构体对齐就是一种空间换时间的方式。


四、总结

以后写结构体一定注意结构体对齐问题,结构体会因为成员不同的排列顺序,产生不同大小的内存占用。

上一篇下一篇

猜你喜欢

热点阅读