漫谈字节对齐
什么是字节对齐
数据在内存地址是它长度的整数倍就叫字节对齐。比如一个整形在0x00000004(假设类型长度32)。不同的系统,数据类型的长度可能略有从差别。
类型/模型 | ILP32 | LP32 | LP64 | LLP64 |
---|---|---|---|---|
char | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 |
int | 32 | 32 | 64 | 32 |
long | 32 | 32 | 64 | 32 |
long long | 64 | 64 | 64 | 64 |
pointer | 32 | 32 | 64 | 64 |
大部分的Unix和linux系统 32位使用ILP32模型,64位使用LP64模型。
为什么要字节对齐
cpu从内存中读取一个数据,假设4字节的整形地址再0x000000004上,一次就可以取出数据,如果4字节的整形不对齐,在0x00000002上,那cpu需要两次操作,一次取0x00000002-0x00000003的数据,一次取0x00000004-0x00000005的数据。这样就会导致效率的降低。
理论上,cpu可以随机从内存处理上取出任意位置的数据。但从图中就可以看出cpu只能从特定的位置取值。想想这是为什么呢?
字节不对齐会遇到什么问题
未完待续。