數據長度我碰到這個語法,我沒有C++指定與數據類型聲明
struct A {
int x:24;
};
見過來到什麼是X:24是什麼意思?在C++中,你可以指定一個編譯器,一個變量應該只佔用24位,而不是32位的int類型? 如果是,哪些24位將被佔用?最左邊還是最右邊?
數據長度我碰到這個語法,我沒有C++指定與數據類型聲明
struct A {
int x:24;
};
見過來到什麼是X:24是什麼意思?在C++中,你可以指定一個編譯器,一個變量應該只佔用24位,而不是32位的int類型? 如果是,哪些24位將被佔用?最左邊還是最右邊?
這是bit fields feature。它早在C天就已經可用了。微軟有a nice write-up on this feature,完整的漂亮的圖片顯示特定於編譯器的佈局(他們說圖片是特定於MS的)。
unsigned:0;是我以前沒有意識到的有趣功能。 – 2012-01-17 19:06:18
但請注意,漂亮的圖片只能描述微軟如何選擇實現它;一般來說,佈局是實現定義的。 – 2012-01-17 19:07:58
@MikeSeymour你絕對正確:這一點是我編輯的主題。 – dasblinkenlight 2012-01-17 19:09:03
這正是你認爲它是,稱爲位字段。 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字節)大,因爲你不能只切斷那些多餘的位。因此,當你有很緊的空間需求,需要儘可能多的信息可以裝入較小的空間儘可能位字段是最有用。
如果你願意用猜測來詳細說明,在這些情況下,編譯器是否實現了mask + bitshift? (移位) – 2012-01-17 19:07:51
@CaptainGiraffe:最有可能的。在硬件層面上,您不能以任何其他方式撕開單詞IIRC。不過有趣的是,任何一個位字段的溢出都不會影響任何其他位字段(如果'x'會溢出,'y'不會改變)(除了這種情況,溢出將是未定義的行爲,因爲'x'被簽名...)。 – Xeo 2012-01-17 19:11:19
在上面的例子中,在int x:24之後是否會有一個填充值,以保持int對齊到32位,或者將來自變量x的餘下8位用於填充變量Y的值? – Jimm 2012-01-17 19:29:35
如果是,這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
編譯器如何將結構與位域進行對齊?它是否會在結構的末尾填充足夠的位,以便在32位平臺上對齊32位?如果一個結構有一個像位int x:8和另一個常規字段int y;在這個例子中,填充將應用於哪裏? – Jimm 2012-01-17 19:38:34
@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
位的排序是CPU依賴逆轉。也許你可以寫一些簡單的東西到這個字段,然後看看調試器中的內存字。
我會想象編譯器會在這裏做繁重的工作,而不是CPU。 – 2012-01-17 19:12:23
X會做出很好奇INT,如果它是一個標準的系統INT的MSB部分。 – 2012-01-17 19:03:21