目录
一.知识点预备
各数据类型的大小:
64位:
注意:在32位和64位下,指针的大小不一样,32位指针大小为4byte,而64位的指针大小为8byte。
二.字节对齐的原因
内存大小的基本字节是byte,理论上,可以从任意地址访问变量,但是,cpu并非是逐字节访问内存的,而是以2,4或8的倍数。为了访问方便,这就要求数据类型在空间上以一定的规则排列。
比如:
"struct A
{
char a;
int b;
char c;
}"
以方法一存储时,提取数据不太好提取,转换提取长度大小是需要时间的。
以方法二存储时,将提取长度固定为4,这样提取的快,但浪费的空间多。
字节对齐是以空间换时间的典型。
a | b | b | b | b | c | ||||||
a | b | b | b | b | c |
三.结构体对齐规则与练习:
以上一个结构体为例进行讨论:
1.结构体变量的首地址,一定是这个结构体变量中最大的基础(内置)类型的成员大小的整数倍。
(首地址为0,0是4的整数倍,所以a在第一个)
0
a |
2.结构体变量中的每一个成员的地址,一定是该成员的基础数据(内置)类型大小的整数倍。
(
a相对于开始地址的偏移量为0
b相对于开始地址的偏移量为1,b的数据类型的大小为4,1不是4的整数倍,故a后补三个空格()。
此时c相当于开始得知的偏移量为8,是1的整数倍。
a |
a | b | b | b | b |
a | b | b | b | b | c |
)
3.结构体变量的总大小一定是这个结构体变量中最大基础类型大小的整数倍。(最后考虑这个)
(经过前两步的分析,此时的总大小为9,不是4的整数倍,故在c之后添加三个空格),故最终占了12个格子。
那么,如果这样写:
题目一:
"struct A
{
int b;
char a;
char c;
}"
题目二:
“struct B
{
char a;
short b;
int c;
}”
题目三:
“struct C
{
char a;
short b;
double c;
}”
题目四:
“struct D
{
char a;
float b;
int *c;
}”
结果见文末,大家可以试试
四.答案
题目1;8
题目2:8
题目3:16
题目4:12