2012-01-17 123 views
5

數據長度我碰到這個語法,我沒有C++指定與數據類型聲明

struct A { 
    int x:24; 
}; 

見過來到什麼是X:24是什麼意思?在C++中,你可以指定一個編譯器,一個變量應該只佔用24位,而不是32位的int類型? 如果是,哪些24位將被佔用?最左邊還是最右邊?

+0

X會做出很好奇INT,如果它是一個標準的系統INT的MSB部分。 – 2012-01-17 19:03:21

回答

6

這是bit fields feature。它早在C天就已經可用了。微軟有a nice write-up on this feature,完整的漂亮的圖片顯示特定於編譯器的佈局(他們說圖片是特定於MS的)。

+2

unsigned:0;是我以前沒有意識到的有趣功能。 – 2012-01-17 19:06:18

+0

但請注意,漂亮的圖片只能描述微軟如何選擇實現它;一般來說,佈局是實現定義的。 – 2012-01-17 19:07:58

+0

@MikeSeymour你絕對正確:這一點是我編輯的主題。 – dasblinkenlight 2012-01-17 19:09:03

4

這正是你認爲它是,稱爲位字段x有24位可用。

// standard 32bit integer: 
0000 0000 0000 0000 0000 0000 0000 0000 
// x (24 bit): 
0000 0000 | 0000 0000 0000 0000 0000 0000 
//  ^-- cut off here 
// other 8 bit available for other uses, for example: 

struct A{ 
    int x : 24; 
    int y : 8; 
}; // sizeof(A) == sizeof(int) (most likely on 32bit architecture) 

請注意,該結構仍然是32位(或4字節)大,因爲你不能只切斷那些多餘的位。因此,當你有很緊的空間需求,需要儘可能多的信息可以裝入較小的空間儘可能位字段是最有用。

+0

如果你願意用猜測來詳細說明,在這些情況下,編譯器是否實現了mask + bitshift? (移位) – 2012-01-17 19:07:51

+1

@CaptainGiraffe:最有可能的。在硬件層面上,您不能以任何其他方式撕開單詞IIRC。不過有趣的是,任何一個位字段的溢出都不會影響任何其他位字段(如果'x'會溢出,'y'不會改變)(除了這種情況,溢出將是未定義的行爲,因爲'x'被簽名...)。 – Xeo 2012-01-17 19:11:19

+0

在上面的例子中,在int x:24之後是否會有一個填充值,以保持int對齊到32位,或者將來自變量x的餘下8位用於填充變量Y的值? – Jimm 2012-01-17 19:29:35

4

如果是,這24位被佔用?最左邊還是最右邊?

它是在C++標準指定(§9.6/ 1:位字段被分配從右到左在某些機器上,左到右他人)。

通常它依賴於平臺的字節序。在一個小型平臺,將被填上:

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
----------------------------------------- -------------- 
        x       (padding) 

和大端平臺

[ bits 0~7 ] [ bits 8~15 ] [ bits 16~23 ] [ bits 24~31 ] 
------------ ------------------------------------------- 
    (padding)      x 
+0

編譯器如何將結構與位域進行對齊?它是否會在結構的末尾填充足夠的位,以便在32位平臺上對齊32位?如果一個結構有一個像位int x:8和另一個常規字段int y;在這個例子中,填充將應用於哪裏? – Jimm 2012-01-17 19:38:34

+0

@Jimm:您可以看到[@dasblinkenlight](http://docs.microsoft.com/zh-cn/library/default.aspx)提供的[鏈接](http://msdn.microsoft.com/zh-cn/library/ewwyfdbe%28v=vs.100%29.aspx) /stackoverflow.com/a/8900155/224671) – kennytm 2012-01-17 19:45:02

1

位的排序是CPU依賴逆轉。也許你可以寫一些簡單的東西到這個字段,然後看看調試器中的內存字。

+0

我會想象編譯器會在這裏做繁重的工作,而不是CPU。 – 2012-01-17 19:12:23