如何减少结构体因对齐规则浪费的空间

ps:结构体内存地址三大原则

  • 原则1:结构体首地址(start)是结构体中最大基本数据类型成员所占空间的整数倍
  • 原则2:结构体中的成员偏移量(offset)是该成员所占字节的整数倍
  • 原则3:结构体的总大小(end-start)是结构体中最大基本数据类型成员所占空间的整数倍

在C语言中,结构体(struct)的内存对齐是为了优化访问速度和满足特定硬件平台的要求。编译器会自动对结构体成员进行对齐,这可能导致某些空间未被使用,从而增加结构体的总大小。

但是在某些内存比较紧张的应用场景下,我们不得不珍惜每一个字节,这个时候就要优先考虑减少浪费,下面是几种方式以供参考

1、调整顺序

最简单的,规范成员的顺序,按照占用的字节数从小到大排列

//32位
struct test {        //占用12字节
    char     a;
    int      b;
    char     c;
}
struct test {        //占用8字节
    char     a;
    char     c;
    int      b;
}

2、packed属性

在编译阶段指定结构体按照自定义的字节数对齐(此属性并非所有平台都支持)

#pragma pack(1)        //指定对齐字节为1
struct my_struct {
    char a;    //1
    int b;     //4
    double c;  //8
};
#pragma pack()        //回复默认对齐方式

3、使用位域(BitFielde)

对于位操作,可以使用位域指定每个成员占用的位数,从而精确控制内存使用

struct my_struct {
    unsigned char a : 1;    // 1 bits for 'a'
    unsigned int b : 4;     // 4 bits for 'b'
};

除此之外还有内存池、压缩技术,这些就是大佬使用的技术了,上面说的大多数场景都足够了

ps:这些办法会影响性能,非内存不足者不能用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值