Redis源码:从struct __attribute__ ((__packed__)) sdshdr到回忆C语言中的字节对齐

1.1字节对齐的概念

计算机中内存大小的基本单位是字节(byte),理论上,可以从任意地址访问某种基本数据类型,但实际上,计算机并非是逐字节读写内存,而是以2、4、8的倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2、4、8的倍数。那么就要求各种数据类型按照一定规则在空间上排列,这就是对齐

1.2字节对齐的原因

由于各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定的地址开始储存。最常见的问题就是,如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。

而我们在实际开发中,倒也无需忧虑这方面的问题,因为相应的语言编译器会替我们选择适合目标平台的对齐策略。(这里需注意:在开发环境 和 正式环境下运行的服务项目,编译打包时,建议使用相同平台进行,避免项目的跨平台编译运行。)

下面我们从实际的例子中去回忆字节对齐:

#include<stdio.h>
#include<stdint.h>
struct test
{
    int a;
    char b;
    int c;
    short d;
};
int main()
{
    printf("the size of struct test is %zu \n", sizeof(struct test));
}
// the size of struct test is 16

从编译运行的结果来开,test的大小为16字节(说明四个类型发生了以4个字节自然对齐的结果),而不是四个类型紧密排列的11字节(int a:4字节、char b:1字节、 int c:4字节、short d:2字节)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值