引子
#inlcude<stdio.h>
struct s{int i;char a:
};
struct s sVar = {5,'A'};
int main(void){printf("%d\n",sizeof(sVar));
}
问1:上面这个代码的输出结果是多少?
答1:
思考
明明sVar这个结构体就两个元素,5和’A’,一个是int型占4个字节,一个是字符型占1个字节,那为什么这里却输出8,说这个sVar结构体占了8个字节呢?
字节对齐
原因就是要想提高cpu在读取内存的速度,就需要有规律的存储数据,确保数据结构在内存中的存储地址是某个数(4,8的倍数),因为cpu读取是按块进行的,例如四字节一读,八字节一读
即便一个int加上一个char本应只占5字节的数据,也会通过字节补齐占8个字节。
内存优化
代码一:
#inlcude<stdio.h>
struct s{int i;int j;char b;char a:
};
struct s sVar = {5,6,'B','A'};
int main(void){printf("%d\n",sizeof(sVar));
}
代码二:
#inlcude<stdio.h>
struct s{int i;char a:int j;char b;
};
struct s sVar = {5,'A',6,'B'};
int main(void){printf("%d\n",sizeof(sVar));
}
问2:代码一和代码二的输出结果分别是多少?
答2:12和16
让我们看一看各自的汇编代码
代码一汇编:
align 为8
占用size 12字节
代码二汇编:
align 为16
占用size 16字节
这个例子也告诉我们在定义数据的时候,应该有顺寻,使得内存得到最大化的利用