我試圖瞭解實現的malloc內存分配的代碼,我偶然發現了這個宏內存分配器宏交代
// get the size of the block from header
#define GET_SIZE(p) (GET(p) & ~0x7)
註釋清楚它做什麼,但我不明白是什麼確實或如何工作。有人可以詳細解釋這一點嗎?
我試圖瞭解實現的malloc內存分配的代碼,我偶然發現了這個宏內存分配器宏交代
// get the size of the block from header
#define GET_SIZE(p) (GET(p) & ~0x7)
註釋清楚它做什麼,但我不明白是什麼確實或如何工作。有人可以詳細解釋這一點嗎?
在二進制,0x7
是.... 0000 0111
,並且~0x7
是.... 1111 1000
,所以GET(p) & ~0x7
值GET(p)
「屏蔽掉」三個最右位,也就是將它們設置爲零。
例如,如果GET(p)
得到10,其爲.... 0000 1010
,GET_SIZE(p)
將8
,其具有.... 0000 1000
的二進制表示。
這與GET(p) - GET(p) % 8
類似,但GET(p)
在這種情況下評估一次。如果GET_SIZE(p)
被定義爲GET(p) - GET(p) % 8
,類似GET_SIZE(i++)
會導致未定義的行爲。此外,它可能會對性能產生一些影響,但現代編譯器被認爲足夠聰明,可以進行這種優化。
〜7意味着反轉7按位的方式,&有一個位掩碼的功能,讓一些,並阻止他人。 –
謝謝!這個例子使它更容易理解! – Krishh
其中大部分包含的文件都是在七十年代編寫的,從不重寫,以防止出現新的錯誤。 –
它提取除get(p)返回值的最右邊三位數字之外的所有內容。大致(p)%8完成得更快。 –
@ArifBurhan那到底是什麼〜0x7呢?我的意思是返回3個最右邊的數字的邏輯是什麼? – Krishh
@ArifBurhan「做得更快」 - 如果你使用的是20世紀70年代的編譯器或許是 –