15.C语言_字节对齐

之前学习,在函数内部定义局部变量,或者在函数里面使用参数时;如果局部变量/参数少于四个字节,编译时发现内存仍然是按四个字节来分配处理的。

为什么编译器要这么做---考虑到执行效率的问题,因为有所谓的本机宽度,CPU处理四个字节处理速度是最快的。所以参数/局部变量小于四个字节,仍然分配四个字节,这是一种牺牲空间来换时间的策略。  除了本机宽度,还有一个概念叫字节对齐,也是一种牺牲空间换时间的策略。

 实验:连续定义两个全局变量,预期变量内存地址是连续的。 假设 char x内存地址是0,则预期int y 地址是1~4.

 实际内存地址是不连续的,68~6C,69/6a/6b浪费了三个。

变量的内存地址,一定是变量宽度的整数倍。(上图6c一定是4的整数倍)

 结构体起始内存地址,是结构体成员中最宽的数据类型的整数倍。

之所以有字节对齐,是为了提升程序执行的效率。

 

 

8,16。

浪费空间较多,执行效率高。在对内存要求很高的情况下(内存很小),有没有办法改变字节对齐方式?宁愿牺牲执行效率,来节省内存。

 #pragma pack(1)  没法改变结构体的起始位置(结构体中最宽数据的整数倍),但是可以改变结构体成员的对齐方式。

1,2,4,8(对齐参数) 在对齐时,与结构体成员比较,以较小那个值的整数倍作为结构体成员地址的起始地址。

原文地址:https://www.cnblogs.com/RevelationTruth/p/13992229.html