本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。
首先,明确一点,这是iOS的实例对齐的官方要求。
- 那什么是实例对齐?
简单的说就是在开辟一块内存空间的时候,只能开辟16的整数倍字节大小的内存空间。这样以16位为单位长度开辟空间,就可以保证内存的连续性上的整齐度。
- 为什么要16字节对齐?
以空间换取时间。
大家都知道字节是内存的容量单位,1内存你也可以叫它1字节。但是,CPU在读取内存的时候,却不是以字节为单位来读取的,而是以“块”为单位读取的,所以大家也经常听到一块内存,“块”的大小也就是内存存取的力度。
如果不对齐的话,在我们频繁的存取内存的时候,CPU就需要花费大量的精力去分辨你要读取多少字节,这就会造成CPU的效率低下,如果想要CPU又有效又不减少存取次数的话,那就需要找一个规范,这个规范就是字节对齐。
1.0.png苹果采取16字节对齐,是因为OC的对象中,第一位叫
isa
指针,它是必然存在的,而且它就占了8位字节,就算你的对象中没有其他的属性了,也一定有一个isa
,那对象就至少要占用8位字节。如果以8位字节对齐的话,如果连续的两块内存都是没有属性的对象,那么它们的内存空间就会完全的挨在一起,是容易混乱的。
以16字节为一块,这就保证了CPU在读取的时候,按照块读取就可以,效率更高,同时还不容易混乱。
(3). 看一下苹果源码中的16字节对齐的算法
static inline size_t align16(size_t x) {
return (x + size_t(15)) & ~size_t(15);
}
直接用了位运算,也是位了提高效率。
网友评论