標籤:pac 就是 required logs 關於 不用 amp round col
接上一篇:C語言記憶體對齊詳解(2)
在minix的stdarg.h檔案中,定義了如下一個宏:
/* Amount of space required in an argument list for an arg of type TYPE. * TYPE may alternatively be an expression whose type is used. */#define __va_rounded_size(TYPE) \ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
從注釋以及宏的名字可以看出是有關記憶體對齊方面的作用。根據前兩篇關於C語言記憶體對齊方面的理論可知
n位元組對齊就是說變數存放的起始地址的位移量有兩種情況:
第一、如果n大於等於該變數所佔用的位元組數,那麼位移量必須滿足預設的對齊(各成員變數存放的起始地址相對於結構的起始地址的位移量必須為該變數的類型所佔用的位元組數的倍數);
第二、如果n小於該變數的類型所佔用的位元組數,那麼位移量為n的倍數,不用滿足預設的對齊。
此時n = 4,對於sizeof(TYPE)一定為自然數,sizeof(int) - 1 = 3
sizeof(TYPE)只可能出現如下兩種情況:
(1) 當sizeof(TYPE) >= 4,位移量 = (sizeof(TYPE)/4)*4
(2) 當sizeof(TYPE) < 4,位移量 = 4
此時sizeof(TYPE) = 1 or 2 or 3,而(sizeof(TYPE) + 3) / 4 = 1
為了將上述兩種情況統一,位移量 = ((sizeof(TYPE) + 3) / 4) * 4
在有的原始碼中,將記憶體對齊宏__va_rounded_size通過位操作來實現,代碼如下:
#define __va_rounded_size(TYPE) \ ((sizeof(TYPE)+sizeof(int)-1)&~(sizeof(int)-1))
由於 ~(sizeof(int) – 1) ) = ~(4-1)=~(00000011B)=11111100B
(sizeof(TYPE) + sizeof(int) – 1)就是將大於4m但小於等於4(m+1)的數提高到大於等於4(m+1)但小於4(m+2),這樣再& ~(sizeof(int) – 1) )後就正好將原長度補齊到4的倍數了。
C語言記憶體對齊詳解(3)