C++内存字节对齐
每个编译器都有自己默认的字节对齐方式。可以通过#pragma pack(n) n为2的幂来改变这一系数。简单地说,32位默认为8bytes,64位默认为16bytes。
- 对齐的规则
1) 结构体或联合体或类的数据成员,第一个数据成员放在偏移量为0的位置,以后的偏移量放在指定数值和这个数据成员自身长度中比较小的哪个进行。
2) 结构体内每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,可以理解为成员所占的空间取决于结构体内最宽的基本元素的大小
3) 结构体本身也会被补充为整数倍。
4) 相同的数据类型是连续的。 基本数据的大小
实例
typedef union {
long i;
int k[5];
char c;
} DATE;
struct data {
//int cat;
DATE cow;
double dog;
} too;
DATE max;
printf("%d", sizeof(struct data) + sizeof(max)); //52
在黄色这里补齐了
一个int的大小来满足内存对齐
typedef union {
long i;
int k[5];
char c;
} DATE;
struct data {
int cat;//比上述多了一个int
DATE cow;
double dog;
} too;
DATE max;
printf("%d", sizeof(struct data) + sizeof(max)); //52
共用体占用20字节,结构体中最大的基本类型为double,因此是8字节对齐。