一個L1 DATA CACHE相當於一塊小的記憶體,我們假設它為16K大,它會與一般實體記憶體互動。 它和記憶體互動一般一次傳輸16個位元組(32個位元組),也就是: CACHE 位元組0-15一次寫到/讀取實體記憶體 ,位元組16-31一次寫到/讀取實體記憶體.32-47 ... ... 這些一次被傳輸的位元組被稱為cache line。 -------------------------------------------------------------- 另外,cache寫到實體記憶體的位置不是任意的, 我們假定記憶體為64K,那麼cache地址0的數值只能和實體記憶體的地址0, 16K, 32K互動;cache地址1的數值只能和實體記憶體的地址1, 16K+1, 32K+1互動 。。。 。。。cache地址16K-1的數值只能和實體記憶體的地址6K-1, 16K+16K-1, 32K+16K -1互動 這說明了兩點: (1)假設對象A的一個欄位長為16個位元組,如果它放在物理地址 0-15,那麼它將和cache的第一個cache line 互動,如果放在物理地址 8-23,那麼 如果CPU要訪問這個欄位,必須將第一個和第二個cache line 都讀入,才能獲得這個欄位的資訊,顯然這樣速度慢,所以一般欄位需要cache line對齊, 在這裡就是16個位元組對齊。 (2)關於colour 一般一個對象某些欄位訪問頻繁些。 假定一個cache(這個cache指slab的cache,不是上面提到CPU的L1 DATA CACHE)佔用5個頁面也就是20K. 假定其中對象大小為32個位元組,前16個位元組訪問頻繁許多。 假定對象A起始於物理地址0,對象C起始於31,對象B起始於物理地址16K,那麼對象A,對象B的前16個位元組都和第一個cache line 互動,後16個位元組都和第二個cache line 互動 對象C前16個位元組與第3個cache互動。 我們假定核心訪問A後就訪問B,再訪問A,交錯進行,並且前16個位元組次數都是50次,後16個為10次。C也是。 這樣第一個cache line 要互動100次,第二個20次,一共120次。 如果讓對象B向後移動16個位元組,也就是對象B的前16個位元組與第二個cache line 互動,後16個與第3個互動。 那麼第一個為2次,因為只有開頭結尾2次要與記憶體互動,其它每次都在L1 DATACACHE 中寫就可以了。第2個cache line為20次左右(後面的只須在CACHE中讀寫),第3個cache line為20次, 3個line一共才41次,你不妨仔細類比一下。 所以進行錯位能降低CACHE的互動次數,從而提高CPU處理速度能力。 這個錯位(也就是上面的16個位元組)就是colour.