对齐和补齐
对齐
对齐的定义
变量在内存中不是任意存放的,需要遵守约定:变量的起始地址必须其有效对齐值的整数倍
默认对齐值
C语言中不同类型变量的默认对齐值:
| 类型 | 默认对齐值(单位:字节) |
| bool | 1 |
| char | 1 |
| short | 2 |
| int | 4 |
| long |
ILP64、LP64:8 LLP64、ILP32:4 |
| float | 8 |
| double | 8 |
对齐值上限
#pragma pack (x) ,该语句强制界定了对齐值的上限为x字节
系统位数也限制了对齐值得上界,32位系统对齐值的上界是4字节,64位系统对齐值的上界是8字节
最终的对齐值上限取前面两者的最小值
有效对齐值
最终的有效对齐值取默认对齐值和对齐值上限的最小值
结构体的对齐值
结构体中最大的成员的有效对齐值
变量存内存为什么需要对齐?
一句话回答:减少CPU为获取变量值读取内存的次数
在CPU眼中,内存的数据是一个个字,32位系统以4个字节为一个字,64位系统以8个字节为一个字。举例来说,有一个int类型的变量,如果它未对齐,前一个字节在一个字中,后3个字节在另一个字中,那么CPU需要读取这两个字,再分别从这两个字中取出变量值所占用的字节,拼接出这个变量值;而如果这个变量是对齐的,那么它只在一个字中,CPU读取一个字就行。
强制更改对齐值上限,可以节约存储空间,但会增加CPU的负担。
补齐
补齐的定义
在结构体的末尾补上足够的字节,使得结构体的大小是其最大成员有效对齐值的整数倍
为什么需要补齐?
未知
浙公网安备 33010602011771号