美文网首页
[044]C语言基础-结构体对齐

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

作者: 王小二的技术栈 | 来源:发表于2020-03-23 20:02 被阅读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读取两次才能完成读取。这样子不就是浪费时间了吗,所以结构体对齐就是一种空间换时间的方式。


四、总结

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

相关文章

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

    一、什么是结构体对齐? 1.1 废话不多说,先来个代码 1.2 运行结果 1.3 疑问 为什么A和B的sizeof...

  • 解析C语言结构体对齐(内存对齐问题)

    解析C语言结构体对齐(内存对齐问题) C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础...

  • c语言结构体对齐

    1.什么是字节对齐 结构体里面一般会按照某种规则去进行字节对齐默认规则如下:对齐是按照结构体中长度最长的变量来对齐...

  • C语言结构体对齐

    对齐原则 原则A:struct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成...

  • NDK开发—结构体、共用体与C++基础(三)

    目录 结构体、共用体与C++基础11、结构体字节对齐2、共用体3、C++ 输出函数符号兼容引用字符串C字符串字符串...

  • 结构体内存对齐

    前言 OC语言底层是基于c和c++的,而NSObject在底层也是用结构体实现的,所以了解了结构体的内存对齐问题对...

  • 数据结构 -- 共用体Union

    在数据结构 -- 结构体Struct一文中详细介绍了结构体的定义以及内存对齐。在C语言中,还有另外一种和结构体非常...

  • 结构体基础(C语言)

  • C 结构体对齐

    转载 结构体对齐详解 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会...

  • C语言中内存对其规则

    C语言中结构体内存对齐规则 对齐规则: 内存偏移为该数据类型的最小整数倍 总体占用内存为结构体中最大数据类型的整数...

网友评论

      本文标题:[044]C语言基础-结构体对齐

      本文链接:https://www.haomeiwen.com/subject/vwcgyhtx.html