Re: [問題] 怎麼算sizeof bit field?

看板C_and_CPP作者 (purpose)時間13年前 (2010/10/08 11:57), 編輯推噓2(2010)
留言12則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《UbuntuSeeker (UbuntuSeeker)》之銘言: : 遇到的問題 : : 利用sizeof計算struct的大小,例如: : struct { : int a; : int b; : int c; : } A; : 那麼, sizeof(A) = 4 * 3 = 12 : 而如果是bit field,例如: : struct { : int a:1; : int b:2; : int c:1; : } A; : 我想請問各位大大該怎麼算sizeof(A)??? : 跑出來的結果是 sizeof(A) = 4 : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : Linux 64bits : g++ : 先謝謝大家的回答 :) 沒用過 64 位元硬體經驗。 C/C++ 規格稍微翻沒查到就放棄了,也許有大大看過,講錯還請指正。 就我認知 int 大小是由 implement-defined,需要保證 sizeof(short) <= sizeof(int) <= sizeof(long) 剛隨便翻看到這篇資料 http://en.wikipedia.org/wiki/64-bit#64-bit_data_models ↑進去後直接往下拉看到第一個表格,其意思好像是說, sizeof(int) 在 64 位元 CPU,且 OS 為 Windows 或 Ubuntu 時,值是 4 (bytes)。 而你只有四個位元,沒有超過 4 bytes,所以編譯器只需要用一個 int 去存放這些 bit fileds 即可。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.134.21

10/08 15:01, , 1F
謝謝p大 我瞭解了 :)
10/08 15:01, 1F

10/09 12:40, , 2F
是目標機器的CPU, 嚴格來說是目標機器的OS所決定
10/09 12:40, 2F

10/09 12:40, , 3F
int/long兩個我也搞不懂哪個是可以變動的 我之前學的是
10/09 12:40, 3F

10/09 12:41, , 4F
int對應累加暫存器的長度 但是我在RISC的機器上看到變成
10/09 12:41, 4F

10/09 12:41, , 5F
long才對應 acc reg的長度 so 比較安全還是同時看
10/09 12:41, 5F

10/09 12:42, , 6F
compiler和目標機器OS 的手冊 才能確定int/long的真實siz
10/09 12:42, 6F

10/09 16:07, , 7F
謝謝。可是我覺得應該看compiler的是如何決策就夠了?
10/09 16:07, 7F

10/09 16:08, , 8F
因為編譯時就要決定機器指令,如果決定是32位元的整數,那
10/09 16:08, 8F

10/09 16:09, , 9F
就把int編成mov eax,整數值,而eax必然對應32位元?
10/09 16:09, 9F

10/09 16:09, , 10F
我也是一知半解,有錯還請指正。
10/09 16:09, 10F

10/17 00:59, , 11F
似乎印象中,vc可以用pragma來縮小使用的byte數,但可
10/17 00:59, 11F

10/17 01:00, , 12F
能會犧牲一點點performance
10/17 01:00, 12F
文章代碼(AID): #1ChfR1Q3 (C_and_CPP)
文章代碼(AID): #1ChfR1Q3 (C_and_CPP)