作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] 怎麼算sizeof bit field?
時間Fri Oct 8 11:57:51 2010
※ 引述《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
推 UbuntuSeeker:謝謝p大 我瞭解了 :) 10/08 15:01
推 softwind:是目標機器的CPU, 嚴格來說是目標機器的OS所決定 10/09 12:40
→ softwind:int/long兩個我也搞不懂哪個是可以變動的 我之前學的是 10/09 12:40
→ softwind:int對應累加暫存器的長度 但是我在RISC的機器上看到變成 10/09 12:41
→ softwind:long才對應 acc reg的長度 so 比較安全還是同時看 10/09 12:41
→ softwind:compiler和目標機器OS 的手冊 才能確定int/long的真實siz 10/09 12:42
→ purpose:謝謝。可是我覺得應該看compiler的是如何決策就夠了? 10/09 16:07
→ purpose:因為編譯時就要決定機器指令,如果決定是32位元的整數,那 10/09 16:08
→ purpose:就把int編成mov eax,整數值,而eax必然對應32位元? 10/09 16:09
→ purpose:我也是一知半解,有錯還請指正。 10/09 16:09
→ concealment:似乎印象中,vc可以用pragma來縮小使用的byte數,但可 10/17 00:59
→ concealment:能會犧牲一點點performance 10/17 01:00