对齐和补齐

对齐

对齐的定义

变量在内存中不是任意存放的,需要遵守约定:变量的起始地址必须其有效对齐值的整数倍

默认对齐值

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的负担。

补齐

补齐的定义

在结构体的末尾补上足够的字节,使得结构体的大小是其最大成员有效对齐值的整数倍

为什么需要补齐?

未知

posted @ 2021-10-24 14:58  骄傲的蚂蚁  阅读(174)  评论(0)    收藏  举报