结构体中的内存对齐操作

来源:互联网 发布:三轴点胶机编程教学 编辑:程序博客网 时间:2024/06/05 10:05
再说这个之前,先看看下面一个结构体的大小是多少:
struct data{  char a;  int   b;  char c;}

答案是12!按照一般逻辑思路各个成员的大小加起来不就是了么?

但是实际的情况并不是这样的,结构体在实际的内存分配中需要进行内存的对齐操作。

这里再说这个之前,先说说偏移量,结构体变量中的成员的地址和结构体变量地址的差值称为偏移量。

编译器在编译源代码的过程中,会遵循下面两个原则进行对齐操作:

1、结构体中的成员变量的偏移量必须是成员大小的整数倍;

2、结构体的大小必须是所有成员大小的整数倍;

接下来,我们剖析上面的结构体:

变量大小            struct data{     偏移量     补齐后   1                    char a;       0          0   4                    int   b;      1          4   1                    char c;       4          4                   }              
经过偏移量的补齐操作,最终结构体大小为(1+(4-1))+(4+(4-4))+1=9满足了原则1。但是不满足原则2,还需要调整,对空间再扩展3,最终为大小为12字节。

而实际的使用中只用了6个字节。使用率只有一半,这样的使用效率特别差,怎么提高利用率呢?可以这样调整:

变量大小     struct data{      偏移量   4            int  b;          0   1            char a;          4   1            char c;          1              }
这样调整后,不需要进行原则1的对齐操作,大小为4+1+1=6。只需要进行原则2的调整为8.相对于第一种情况节省了4个字节的空间。有时候结构体空间的重排列可以节省一些内存空间,这在有些程序中是极其需要的~


0 0
原创粉丝点击