结构体为什么要4字节对齐?

为什么要对齐?

因为在32位操作系统(虽然64位操作系统,但是为了保证兼容性,编程仍然主要考量32位)中,数据总线是32位,地址总线是32位。 
地址总线是32位,意味着寻址空间是按4递增的;数据总线32位意味着一次可读写4byte。 
考虑这样一个结构体

struct stu1  
{   
   char c1;   
   int i;  
   char c2;  
} 

不对齐就意味着,当我们执行stu1.i 时,需要读取内存两次。而对齐后,就只需要读取一次,众所周知,I/O操作是很耗时的,编译器做出对齐的选择也就好理解。

为什么不完全按照4字节对齐的?

既然对齐可以避免上述的问题,为什么不将所有存储小于4byte的数据类型(char, short等)统统按4byte对齐呢? 
考虑这样一个结构体

struct stu2  
{   
   char c;   
   short s;
   int i; 
   double d; 
}

不按4字节对齐

为什么编译器采用B方案,而不采用A方案? 

还是因为32数据线一次读取4个字节, 
采用方案A,读取stu2.c,或者stu2.s,要一次读取4个byte,再舍弃无关内存的数据。 
采用方案B,读取stu2.c,或者stu2.s,也是要一次读取4个byte,再舍弃无关内存中的数据。 
同样的I/O操作,相比之下,明显方案B更节省内存。

补充: 如上图中,所示8字节的数据类型,比如double, long long,必须要读取两次内存。
明白这两点,再回看上面结构体大小的计算方法,就简单多了,也不用死记烂背了。 
另外,写代码时也知道怎样节省内存了(虽然大多数时间不用考虑这点)。

猜你喜欢

转载自blog.csdn.net/JerryGou/article/details/87920135