今天群里有人面试碰到问oc内存对齐的,记录一波:
图一这个结构体,占用4个字节
而图二这个结构体呢?答案是:4+4+1+1 = 12个字节
为什么char明明是1个字节,这里却说是4呢?因为这个结构体里,最长字节是4字节,即int b,而根据内存对齐原则,char占一个字节,后面还剩3个字节,但是3个字节装不下int b,那么char后面接的3个字节就会成为内存碎片,即4个字节,int本身占4个字节,最后char c ,char d,明明是两个1字节,为什么最后还是12个字节呢?还是对齐原则,c+d为2字节,后面空出两个内存碎片,但是还是会占满4字节,所以最后,这个结构体占有的字节数量,是12字节。
图三就显而易见了,圆圈即代表内存碎片,而内存之所以对齐,是为了寻址方便,快速寻址,同样一个结构体,如果字节不对齐 站12个字节,如果对齐占8个字节。
比如
typedef struct demo{ char a; int b; char c; }demo
这个结构体占12字节,而typedef struct demo{ int b; char a; char c; }demo
这个结构体占8个字节。
那么在实际开发中,有哪些注意点呢?其实手机内存现在这么大,对于这几个字节也不需要在意,但是还是要保持一个良好的习惯,比如,写结构体的时候,占用字节最多的类型,写在前面,同时,如果项目对接了一些内存很小的硬件,比如蓝牙数据传输之类的,能优化还是要尽量优化。还有,结构体最小占用字节也是4个字节,并且一个结构体占的内存数一定是4的倍数哟,即使里面只有一个char.