2011-05-26 40 views
4

我需要處理以下形式的一些數據:ç位域內存使用率

typedef struct{ 
    unsigned n1 : 12; 
    unsigned n2 : 12; 
    unsigned n3 : 12; 
    unsigned n4 : 1; 
    unsigned n5 : 35; 
} data; 

我確信,在他們總共數到9個字節。
但它們不會。將該結構的9個字節寫入文件並將其讀回並不會恢復所有數據,並且sizeof(data)將返回16.
這裏有什麼問題?

+3

填充。不能保證編譯器如何分配這些位和/或在結構之後插入多少填充。編譯器喜歡在均勻的邊界上結束數據結構。什麼構成了一個平坦的邊界是由幾個因素決定的,其中最重要的是處理器架構。 – Lou 2011-05-26 17:42:27

回答

1

您的結構9個字節長。編譯器將其填充到16個字節以更加緩存友好。這可以關閉(我不推薦它通常)使用編譯器特定的指令/關鍵字。見data structure alignment

0

這會工作得非常好一個36位計算機上。你忘了告訴我們,如果這是你所擁有的...

在一個更常見的32位機器上,使用9字節對齊將是很難實現。如果您創建了這些結構的數組,則需要使用不同的代碼來訪問地址模0和地址模9的對象中的字段。

前三個字段的12位必須是收集從不同的unsigned s,並根據地址不同。

其他答案中的打包指令不太可能在這裏工作,除非你有硬件的位尋址(或36位CPU)。