什么是字节对齐
计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的 倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。
#include <stdio.h>
#include <stdint.h>
struct test
{
int a;
char b;
int c;
short d;
};
int main(int argc, const char * argv[]) {
/*在32位和64位的机器上,size_t的大小不同*/
printf("the size of struct test is %zu\n",sizeof(struct test));
return 0;
}
编译成32位程序并运行(默认四字节自然对齐),可以看到,结构体test 的大小为16字节,而不是11字节(a占4字节,b占1字节,c占4字节,d占2字节)
为什么要字节对齐
无论数据是否对齐,大多数计算机还是能够正确工作,而且从前面可以看到,结构体test本来只需要11字节的空间,最后却占用了16字节,很明显浪费了空间,那么为什么还要进行字节对齐呢?最重要的考虑是提高内存系统性能 前面我们也说到,计算机每次读写一个字节块,例如,假设计算机总是从内存中取8个字节,如果一个double数据的地址对齐成8的倍数,那么一个内存操作就可以读或者写,但是如果这个double数据的地址没有对齐,数据就可能被放在两个8字节块中,那么我们可能需要执行两次内存访问,才能读写完成。显然在这样的情况下,是低效的。所以需要字节对齐来提高内存系统性能。 在有些处理器中,如果需要未对齐的数据,可能不能够正确工作甚至crash,这里我们不多讨论。
• 结构体成员合理安排位置,以节省空间
• 跨平台数据结构可考虑1字节对齐,节省空间但影响访问效率
• 跨平台数据结构人为进行字节填充,提高访问效率但不节省空间
• 本地数据采用默认对齐,以提高访问效率
• 32位与64位默认对齐数不一样 ,分别是4字节和8字节对齐

493

被折叠的 条评论
为什么被折叠?



