看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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