结构体内存对齐

一、结构体对齐规则

1.第一个成员在于结构体变量偏移量为0的地址处;

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;

3.结构体总大小为最大对齐数(每个成员变量都有对齐数)的整数倍;

4.如果嵌套了结构体的情况,潜逃的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

对齐数:编译器默认的一个对齐数 与 该成员大小的较小值

二、结构体内存对齐例题

struct Test{
    char a;
    short b;
    int c;
    double d;
    int e;
    short f;
    char g;
}

a的对齐数是1

b的对齐数是2

c的对齐数是4

d的对齐数是8

e的对齐数是4

f的对齐数是2

g的对齐数是1  共占据24字节

绿色框表示结构体占据的内存,红色斜线表示浪费的内存,浪费这个内存是为了提高硬件的执行效率。因为CPU从内存中读取数据的时候不是一个字节一个字节的读

 

struct Test{
    char a;
    double b;
    char c;
    double d;
}

共占据32字节

三、其他

1.修改默认字节对齐数

通过#pragma pack() 

写跨平台程序一般需要手动指定对齐数,否则平台默认对齐数不同会引起结构体内存布局不同引入bug

2.enum

c语言中enumerate和int是等价的,枚举的目的只是为例代码的可读性更好。

enum表示的含义:可以穷举出来的概念

枚举默认从0开始

enum例题

enum{
    X,
    Y,
    Z = 255,
    A,
    B,
}
enum  enumA = Y;
enum  enumB = B;

Y和B应该分别为1, 257

枚举默认从0开始,则X是0 Y是1, 因为Z是255,所以A是256则B为257

3.union

联合体的各种成员,共用一块内存空间。

内存按照占字节数最多的来算

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值