2016-03-13 21 views
0

我試圖瞭解實現的malloc內存分配的代碼,我偶然發現了這個宏內存分配器宏交代

// get the size of the block from header 
#define GET_SIZE(p) (GET(p) & ~0x7) 

註釋清楚它做什麼,但我不明白是什麼確實或如何工作。有人可以詳細解釋這一點嗎?

+0

它提取除get(p)返回值的最右邊三位數字之外的所有內容。大致(p)%8完成得更快。 –

+0

@ArifBurhan那到底是什麼〜0x7呢?我的意思是返回3個最右邊的數字的邏輯是什麼? – Krishh

+0

@ArifBurhan「做得更快」 - 如果你使用的是20世紀70年代的編譯器或許是 –

回答

3

在二進制,0x7.... 0000 0111,並且~0x7.... 1111 1000,所以GET(p) & ~0x7GET(p)「屏蔽掉」三個最右位,也就是將它們設置爲零。

例如,如果GET(p)得到10,其爲.... 0000 1010GET_SIZE(p)8,其具有.... 0000 1000的二進制表示。

這與GET(p) - GET(p) % 8類似,但GET(p)在這種情況下評估一次。如果GET_SIZE(p)被定義爲GET(p) - GET(p) % 8,類似GET_SIZE(i++)會導致未定義的行爲。此外,它可能會對性能產生一些影響,但現代編譯器被認爲足夠聰明,可以進行這種優化。

+1

〜7意味着反轉7按位的方式,&有一個位掩碼的功能,讓一些,並阻止他人。 –

+0

謝謝!這個例子使它更容易理解! – Krishh

+1

其中大部分包含的文件都是在七十年代編寫的,從不重寫,以防止出現新的錯誤。 –