把long赋值给int不就会被截断嘛,只要实际的数值可以被int所容纳不就行了嘛。顶多也就是个警告而已。
为啥要使用数值的对象类型呢?
因为它对基本数值类型做了封装,屏蔽了环境32位和64位的差别,让你专注于逻辑上的思考。
NSNotFound居然是个数字!
本节说32位编译器以4字节为单位对齐,64位编译器以8字节为单位对齐。原因为32位编译器中的32除以8等于4,同理可知64位环境中8的由来。
32位环境以4字节为对齐单位,64位环境以8字节为对齐单位。
本节中还举了这样一个struct结构体的例子。
书中说在32位环境下由于前三个变量都各占4个字节,并且符合32位环境下的对其单位,所以前三个成员总共占了12个字节,最后一个变量自身大小占8个字节,又是对齐单位的倍数,所以没问题。
但是在64位环境下前两个成员占了8个字节正好一个对齐单位,但是第三个成员自身是4个字节,对齐单位是8个字节,所以它占不到8个字节。这样会导致第四个成员的前四个字节被填充到第三个字节空余的那个4个字节中,后四个字节在新的内存对其单位中。CPU想访问第四个成员的时候需要先访问第三个成员所在的8个字节中的后四个字节,再访问第四个成员所在的新的8个字节中的前4个字节。造成读写效率的低下,为了避免这种情况的出现,所以需要把第三个成员变量的所造成的空白的4个字节填充满。
所以写结构体的惯例是先写占用内存大的类型,然后写占用内存小的类型。你也可以不遵守这个惯例而使用强制对齐。
所谓紧凑型的数据结构,是从内存的排布角度来说的,就是无论是32位环境下还是64位环境下所占用的实际内存尽量的小,为什么呢,因为有个填充的机制。如果数据设计得不好填充所需要的空间会很大。