2009年12月18日 星期五

神奇的macro _INTSIZEOF( )

#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int)-1) & ~(sizeof(int)-1))

這個macro可以算出變數n的大小
而且是以 int作為 alignment
簡單說就是
變數 n所佔用的 size會被 round up到 sizeof(int) 的整數倍

例如說 /* 假設 sizeof(int) == 4 */
char n[11];
則 _INTSIZEOF(n) 就是 12
原本使用 sizeof(n) 會等於 11

short s;
則 _INTSIZEOF(s) 就是 4
原本使用 sizeof(s) 會等於 2

原理主要是利用最小的兩個bits
加上3(decimal) = 11(binary) 強迫進位
以達到alignment的效果

當sizeof(n)最小兩個bits有以下四種情況:
(此處以8個bits簡化說明)

xxxxxx00 + 00000011 = xxxxxx11 (sizeof(n) + sizeof(int)-1)
xxxxxx11 & 11111100 = xxxxxx00 & ~(sizeof(int)-1)

xxxxxx01 + 00000011 = xxxxxx00 (有進位到第3個bits)
xxxxxx00 & 11111100 = xxxxxx00

xxxxxx10 + 00000011 = xxxxxx01 (有進位到第3個bits)
xxxxxx01 & 11111100 = xxxxxx00

xxxxxx11 + 00000011 = xxxxxx10 (有進位到第3個bits)
xxxxxx10 & 11111100 = xxxxxx00

由以上式子可以看出來
最小2個bits是0的話,沒有影響
因為本來就是4的倍數
有1,2,3的成分都會被無條件round up到4
所以會造成
5 ( 4 + 1 ) 會被 round up 到 8
6 ( 4 + 2 ) 會被 round up 到 8
7 ( 4 + 3 ) 會被 round up 到 8
之後的數字可以此類推

想到這個macro的,真是個高手!

[Reference]
macro是抄來的,說明是原創哩

沒有留言:

張貼留言