什么是字节对齐?
计算机并非逐字节读取内存,而是按2,4,8的倍数的字节块读写内存,故地址必须为上述倍数,故各种数据类型需要按照一定规则在空间上排列
对齐准则
- 结构体变量首地址可被对齐字节数大小所整除
- 结构体每个成员相对该结构体首地址的偏移都是成员大小的整数倍(如需要,填充字节)
- 结构体总大小为结构体对齐字节数大小的整数倍
为什么要字节对齐?
可优化【读写效率】【空间存储】【跨平台通信】
读写效率
考虑场景如下:若计算机每次读取8字节块,此时读取一个double,若未字节对其,可能该double位与两个不同的字节块,需要做两次读取才能读出double的值,显然效率低下!
空间存储
字节对齐的细节由编译器实现,为何我们还需要考虑字节对齐?
考虑如下代码
#include<stdio.h>
#include<stdint.h>
#ifdef DEBUG
struct test
{
int a;
char b;
int c;
short d;
test(int v1, char v2, int v3, short v4) :