把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位環境下所占用的實際內存盡量的小,為什么呢,因為有個填充的機制。如果數據設計得不好填充所需要的空間會很大。