简单讲解C语言中为什么要使用字节对齐

本文探讨了C语言中结构体填充与数据对齐的重要性,详细解释了字节对齐的原因,旨在提高CPU访问内存的效率。通过介绍不同编译器的字节对齐方法,如GCC的__attribute__((packed))和__attribute__((aligned(n))),强调了结构体指针在处理大数据成员时的效率优势。
摘要由CSDN通过智能技术生成

结构体填充与数据对齐

  • 结构变量的大小等于它包含所有变量的总大小。
  • 结构体填充:是编译器用来对齐内存偏移数据。
  • 字段填充:为了提高性能,编译器在结构体中利用 结构体填充 方法进行数据对齐。
  • 数据对齐:当CPU读写内存时,它都在小块内(字长或4个字节)进行。这种安排增加了系统的性能,有效地将数据存放在字长整数倍的偏移地址。
    • 结构体中每个数据类型都要对齐
    • 联合体中按照最大长度的数据类型对齐
    • 按照基本数据类型对齐

为什么要字节对齐?

现代计算机中内存的存储理论上都是按照 byte 大小来存储的,但实际上是按照 字长(word size) 为单位存储的。这样做是减少CPU访问内存的次数,加大CPU访问内存的吞吐量。比如同样读取8个字节的数据,一次读取4个字节那么只需要读取2次。
在这里插入图片描述

字节对齐方法

  • C编译器中采用#pragma指令#pragma pack(n) 编译器将按照 n 个字节对齐
  • _packed: 按照一字节对齐。packed一般会以降低运行性能为代价,由于大多数cpu处理数据在合适的字节边界数的情况下会更有效,packed的使用会破坏这种自然的边界数。
  • GCC编译器中采用
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值