结构体的秘密:从定义到内存布局全解析

一、结构体的基础定义

在 C 语言中,struct 是一种非常强大的自定义数据类型,它能将不同类型的数据打包到一个整体中。

结构体(struct)可以将多个不同类型的变量组合在一起,例如:
 

struct Student

{
    int id;
    char name[20];
    float score;
};

二、结构体的内存布局

现代计算机对某些类型的数据要求按特定地址访问(对齐),否则访问效率低,甚至出错。因此编译器会:

  • 按照每个成员的数据类型要求对齐

  • 在必要时插入 填充字节(padding)

  • 整个结构体的大小也会被 对齐到最大成员的对齐数的整数倍

三、示例分析

64位系统(x86_64)默认对齐数(结构体)为8

变量的偏移量为变量占据字节大小和默认对齐数的最大公约数

结构体占据的内存空间为所有变量占据字节大小和默认对齐数的最大公约数

在这个例子中,char的最大公约数为1

                         int的最大公约数为4

所以在这个结构体中占据的总内存空间大小因为四的倍数

而且在int的内存分配开始的偏移量也要时四的倍数,而char只需要为1的倍数

struct Example 
{
    char a;   // 1 字节
    int b;    // 4 字节
    char c;   // 1 字节
};

红色代表浪费的空间

创建第一个变量char时,从内存偏移量为1的位置开始分配空间,占据一个字节

创建第二个变量int时,从内存偏移量为4的倍数的位置开始分配空间,占据四个字节

创建第三个变量char时,从内存偏移量为9的位置开始分配空间,占据一个字节

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值