之前学习,在函数内部定义局部变量,或者在函数里面使用参数时;如果局部变量/参数少于四个字节,编译时发现内存仍然是按四个字节来分配处理的。
为什么编译器要这么做---考虑到执行效率的问题,因为有所谓的本机宽度,CPU处理四个字节处理速度是最快的。所以参数/局部变量小于四个字节,仍然分配四个字节,这是一种牺牲空间来换时间的策略。 除了本机宽度,还有一个概念叫字节对齐,也是一种牺牲空间换时间的策略。
实验:连续定义两个全局变量,预期变量内存地址是连续的。 假设 char x内存地址是0,则预期int y 地址是1~4.
实际内存地址是不连续的,68~6C,69/6a/6b浪费了三个。
变量的内存地址,一定是变量宽度的整数倍。(上图6c一定是4的整数倍)
结构体起始内存地址,是结构体成员中最宽的数据类型的整数倍。
之所以有字节对齐,是为了提升程序执行的效率。
8,16。
浪费空间较多,执行效率高。在对内存要求很高的情况下(内存很小),有没有办法改变字节对齐方式?宁愿牺牲执行效率,来节省内存。
#pragma pack(1) 没法改变结构体的起始位置(结构体中最宽数据的整数倍),但是可以改变结构体成员的对齐方式。
1,2,4,8(对齐参数) 在对齐时,与结构体成员比较,以较小那个值的整数倍作为结构体成员地址的起始地址。