C语言学习笔记(结构体对齐问题)

首先介绍一下c语言中sizeof()运算符,sizeof()是一个静态运算符,静态运算符其意思就是说在编译的过程中,这个运算符就是不会执行括号内的代码段,它只是负责由系统测出括号内那部分数据在内存中所占的字节大小,最终值是一个整型值;比如,sizeof(a++)这个执行后,其实里面a变量是不会自加1的,还是原来那个a,sizeof()的作用只是将里面那个变量a进行自加后的类型看看在内存中占的字节大小,然后返回这个值。

sizeof(结构体)这种情况下所返回的值,一般需要综合考虑结构体成员的最大限度以及字节对齐等情况,比如字节对齐这个概念,形象点解释就是为了加快数据和指令的存取效率,CPU一般会内存中存放的数据进行对齐,这可以使得取数据以及取指令时可以极大地提高效率。比如如果一个32位的int变量需要被取出内存放到寄存器中,那么这个时候假如cpu是从内存偶地址的地方开始取这个变量数据的,那么int变量如果也是从偶地址开始对齐存放,那么只需要一个取指周期就可以取到这个变量。但是,如果int是从奇地址开始存放,由于这时奇地址开始的32位地址就不可能够空间存放一个完整的int,所以此时需要两个取指周期才能取到这个数据。形象点说,比如一个人在一个房间里,那么房间相当于内存32位的地址空间,那个人就是代表要取的数据,对齐的话就是说这个人刚好整个人都在房间里,CPU拿出这一个房间就肯定可以取到这个完整的人,但是如果不对齐的话,也就是说这个人可能有一只脚或者身体某一部分是在门外面,这个时候拿出一个房间是不可能取到这个完整的人的,必须要再拿另一个放着这个人身体其余部分的房间。

同理,其实结构体对齐也是差不多这种原理,但是稍微复杂一些。因为结构体相当于房间里有形形色色很多人,高矮肥瘦各种都有,这个时候就要考虑空间的问题了。具体可以参见百度百科(字节对齐概念)http://baike.baidu.com/link?url=iukYjS9rA0t3ekYlzBNWPGFrz-VfoLWkaQ_C-cm23OPjRCpjUxiKcLOW_b34G_n6tYNfGxTBlhg98awexrs0xa#4_1或者(内存对齐)http://baike.baidu.com/view/4786260.htm




你可能感兴趣的:(c语言学习)