1. 引言
字节对齐属于编译器的内容,决定数据实际的存放方式。主要有两个作用:1.优化数据储存,减少空间浪费 2.增加数据读取速率,本文将于以上两点展开,简述字节对齐的原理以及应用
本文参考以下链接: 什么是字节对齐,为什么要对齐?
2.字节对齐原理
几个原则与基本概念:
1.对于32位的CPU只能从4的整数倍地址读取数据,这是硬件设计上为了最大化性能而确定的(同时并行读取32位数据)
链接: 到底为什么要内存对齐?
3.编译器遵循自然对齐原则,即为声明对齐数据,存放在4的整数倍地址(不同平台有所差异)
2.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
3.结构体的自身对齐值:其成员中自身对齐值最大的那个值。
4.指定对齐值:#pragma pack (value)时的指定对齐值value。
5.数据成员和结构体的有效对齐值:数据成员(数据类型)和数据结构的自身对齐值和指定对齐值中小的那个值。(数据成员对齐了数据结构自然也就对齐了)
6.有效对齐值最终用来决定数据地址的存放方式,有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0"
7.编译器对于结构体遵循圆整规则,即总大小%结构体有效对齐值 = 0,向上取整;
未字节对齐结构体示例:
#include
<stdio.h>