目录
为什么存在内存对齐?
1.平台原因:某些平台只能在某些地址处取得特定的类型的数据;
2.性能原因:对齐的内存访问只需要一次;没有对齐的需要两次;
因此在声明的时候,就要把空间小的成员,集中放在一起;
不同编译器下的默认对齐数是不一样的:
vs编译器 默认对齐数是:8;
linux环境下没有默认对齐数,换言之,自身大小就是对齐数。
以下运行环境为vs编译器下运行;
结构体大小计算
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S2
{
char c1; // 大小1 对齐数 1
int i; // 大小 4 对齐数 4
char c2; // 大小1 对齐数 1
};
int main()
{
struct S2 s;
printf("%d\n",sizeof(s));
return 0;
}
嵌套结构体大小计算
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S3 {
double d; //大小 8 对齐数 8
char c; // 大小 1 对齐数 1
int i; //大小 4 对齐数 4
};
struct S4 {
char c1; //大小 1 对齐数 1
struct S3 s3; // 大小 16
double d; // 大小8 对齐数 8
};
int main()
{
printf("%d\n", sizeof(struct S3));
printf("%d\n", sizeof(struct S4));
return 0;
}
联合体(共用体)大小计算
需要注意的是,联合体内,成员会共用内存空间的第一个字节;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union Un {
char c;
int i;
};
int main()
{
union Un u;
printf("%d\n",sizeof(u));
printf("%p\n",sizeof(&u));
printf("%p\n",sizeof(&u.c));
printf("%p\n",sizeof(&u.i));
return 0;
}
练习一
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union Un {
char arr[5]; //大小5 对齐数 1
int i; //大小4 对齐数 4
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
return 0;
}
练习二
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union Un {
short arr[7]; //大小14 对齐数 2
int i; //大小4 对齐数 4
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
return 0;
}