看板 C_and_CPP 關於我們 聯絡資訊
我很好奇,像C跟C++這種那麼底層的語言,除了部分variable(bool、float、double) 為何不全部的vairable都用、而且只能用bit-field的方式去宣告? 舉例來說 char從C++14開始的定義是至少8 bit int的定義是至少要16 bit 如果可以改成 int:7 a; 這樣表示至少7 bit的int(然後沒有char、short、long、long long,統一用int來表示) 所以我能表示的值的範圍就從0到127,或是-64到63 如果我要寫入這個a值,那我可以寫成 a=to_unsigned(60); //存正數 a=to_signed(-30); //存負數 也就是說,a只負責存放資料,它本身不處理正負問題,讀跟寫都看programmer func(unsigned int:6 a) //一個存放0到63的a int *p; //pointer本身大小仍然是32或64 bit,但指向的int就不一定了 int:6 *p; //只能指向至少存放6 bit的int,如果指向int:8也可以 而且對於已經存在的compiler 如果該machine沒辦法支援這種功能,或是compiler還沒做這種功能,那 小於8的就當作8 小於16的就當作16 ... 就只是把這功能關掉,其餘的跟現在的variable沒什麼不同 但如果有支援這功能,那就可以更有效地利用bit數 而且cstdint裡面的東西大概都不需要了 速度還可能可以提升? 例如現在register是32 bit,我可以讀取多個int,只要bit數加總小於或等於32就好 而不會只能讀取1或2個int(因為現在int大部分都是32 bit,但其實int指只要求16 bit) (小弟的觀念可能有錯,這我不太確定) 不知道各位怎麼看這功能? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.233.71 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1469861751.A.8E9.html
wtchen: 不懂,不是已經有bit-field可以指定struct裡面的位元? 07/30 15:06
wtchen: 真的需要自訂typedef struct不就好了? 07/30 15:06
對阿,我知道有bit-field 只是覺得為什麼不要全部的variable都採用bit-field 除此之外,有時候只需要表達一些狀態(例如表達0-31),卻需要用char去存 或是有時候可能只需要21個bit,卻需要用long去存 不覺得這樣很浪費嗎? (而且沒辦法一眼就看出,到底這個variable的range是多少)
wtchen: 而且這樣搞法如果不能用alignment不是效能更差? 07/30 15:07
我沒想到alignment的問題... 但是如果原本做不到alignment,換成這種做法,反而有可能做得到不是嗎? 如果仍然做不到,那也會用padding來避免效能更差 所以從alignment方面來看,這麼做應該是不會效能更差吧?
CaptainH: 運算的時候還不是要做bit mask 07/30 15:11
恩... 所以這樣做的好處可能就不是在效能上,而是在語意的表達上 用這種方式,能更清楚說明,這個variable的值的範圍
ilikekotomi: 只是要清楚的話 在變數命名上加bit數這樣可以更清楚 07/30 15:49
可是變數命名不是我能決定的... 如果是用這種方法,那就是強制的了
MOONRAKER: 對不齊怎麼可能速度更快 噗 07/30 16:13
會改成這樣,表示新的做法的bit數一定<=現有做法的bit數 那表示說新做法的bit數,一定可以靠padding,來變回現有做法的bit數 那也就是說,現有做法能夠做到的事情(例如alignment),新的做法一定做得到 那這樣alignment所引起的效能問題就不存在了 我的理解是這樣啦
MOONRAKER: 原因就是不需要 C有那麼多user 對應那麼多硬體 07/30 16:13
MOONRAKER: 語言設計出來幾個常用寬度 不同實做可以各自決定 07/30 16:14
我其實有個問題是 如果未來的硬體實作都改變的話,那怎麼辦? 與其到時候才改標準,不如現在把標準弄得更彈性一點,不是比較好嗎? 反正對於那些主流的硬體,其實沒什麼不同 對於那些特殊的硬體,至少它現在可以說,能支援C語言
MOONRAKER: 這樣就很_實用_了 就算浪費空間也有限 而且方便互通 07/30 16:15
MOONRAKER: 你char寬度7 我寬度6 這種惡夢已經夠久了 不要再來了 07/30 16:16
james732: 問題應該是CPU處理的效率與空間的利用? 07/30 16:19
james732: 畢竟CPU指令集對於數字通常都有固定的長度? 07/30 16:20
james732: 呃我不覺得這個彈性有什麼好處耶…除了複雜化以外XD 07/30 17:18
大概就是 可以一眼就知道值的範圍 QQ 突然覺得這樣好沒用...
CoNsTaR: 與其讓使用者決定變數大小 還不如讓編譯器決定 07/30 17:23
CoNsTaR: 只要你這語言的語意可以表達得夠清楚(像fp語言) 07/30 17:23
CoNsTaR: 很多變數的值的上限都能在編譯期被求出來 07/30 17:23
CoNsTaR: 讓使用者不用擔心變數大小 真正的 bit 數編譯器會在編譯 07/30 17:23
CoNsTaR: 期幫你決定 你改程式也不用擔心變數大小 編譯器幫你算 07/30 17:23
CoNsTaR: 使用上整數就通通是 int 浮點數就全部用 double 之類的… 07/30 17:23
CoNsTaR: 至於無法求出上限的就照 C++ 原本標準來做 你覺得這樣如 07/30 17:23
CoNsTaR: 何 07/30 17:23
如果靠programmer能做得更好的,應該就讓programmer去做 舉例來說,假設我很確定使用者的輸入介於0~7 那我可以宣告 int:3 a; 來存放這個input 可是如果用現有做法,就是 char a; 那這樣programmer在讀我code的時候,前者所能表達的意思比後者更多(如果不用註解) (當然也可以用struct包起來,但大概沒人會願意這麼做) 只用int跟double這方法很不錯(再加一個bool),希望C++能改成這樣 XD
CoNsTaR: 你說的是抽象化分類的極端 我講的是泛化統整的極端 07/30 17:23
CoNsTaR: 這種問題沒有答案 所以…還是照原本就好囉… 07/30 17:23
CoNsTaR: 畢竟 C/C++ 都是強調不做太多的語言(像是沒有GC) 這種事 07/30 17:23
不做太多->programmer要寫比較多code 所以我的提案也蠻符合的吧?
CoNsTaR: 情需要的人再用 bitfield 就好啦 XD 07/30 17:23
james732: 整數通通是int,浮點數通通是double←這我喜歡XD 07/30 17:26
james732: 我除了寫在嵌入式系統斤斤計較以外,通常都只用int...XD 07/30 17:26
wtchen: 覺得這樣做會讓可攜性變差.... stdint原本就是為了可攜性 07/30 17:51
wtchen: 增加的不用stdint反而各搞各的不是compiler要對應各種需求 07/30 17:52
wtchen: 變得更複雜,就是code移到別的平台後效能差很大 07/30 17:52
我覺得可攜性應該不變才對吧? 對於不支援這種功能(例如要求int 6 bit)的平台 就只是把這個int提升到8 bit或16 bit而已(就是換成現在的char或int) 只要你使用你所宣告出來的bit數內的值,換個平台仍然可以正常運作 反而是那些使用int8_t、int32_t的人,才有可攜性的問題 (其實我很好奇,到底是甚麼情況,一定要用int8_t,但是不能用int_least8_t?) 如果你要用int_fast8_t,那頂多就是寫成 int_fst:8 a; 但是compiler會需要做得更複雜,這就是真的了
CoNsTaR: 使用者輸入就是一個編譯器算不出上/下限的東西啊 這種東 07/30 17:58
CoNsTaR: 西照你的方法是很適合沒錯啦XD 07/30 17:58
CoNsTaR: 應該說是各有用途 用在不同地方吧 07/30 17:59
CoNsTaR: 或許你已經強制指定的編譯器就直接用你的特化版 07/30 18:01
CoNsTaR: 沒指定的它再幫你算 你沒指定它又算不出來看是要報錯 還 07/30 18:01
CoNsTaR: 是用原本標準 07/30 18:01
CoNsTaR: 這樣寫個程式也好累喔 XDDD 不過是滿不錯的構想啦說真的 07/30 18:02
CoNsTaR: 增加程式安全性 07/30 18:03
wtchen: 是覺得這種大部份新手不會用的功能不要加進去 07/30 18:04
可是常看到有人... 把int拿來當作32 bit來用(大部分情況是可以,但就是不符合標準,int只保證16 bit) 問bit field的實際大小是甚麼(都說是implementation defined,還一直問) 就會覺得還不如普及化這些知識 而且對我來說,把值的範圍寫得很精確的話,debug起來比較容易
wtchen: 真的必要用bit-field就好,否則debug起來又是災難 07/30 18:05
就是因為bit field要放在struct很麻煩,所以才提這方法的...
CoNsTaR: debug 災難沒錯 不過這做法也可以避免掉很多很多 bug 了 07/30 18:07
CoNsTaR: XD 07/30 18:07
Sidney0503: 你都說底層了 你知道c和組語的關係嗎........ 07/30 18:28
所以才上來討論,問問各位的看法,請求大師開悟 <(_ _)>
Sidney0503: 另外 C++已經可以說跟C截然不同了 07/30 18:29
Sidney0503: 首先你的目的是什麼? 你想要控制值的範圍? 07/30 19:05
1.明確表示值的範圍 int:6 a; 只表示至少6 bit,不要求實際大小是6 bit 2.省空間 如果能夠達到實際大小是6 bit,那就有省空間了
Sidney0503: 那就是一件很奇怪的事 因為都是2^n相關 07/30 19:05
Sidney0503: 你想要跑快一點 只要一次pipeline可以吃 幾bit都沒差 07/30 19:06
Sidney0503: 省空間? 與其省這個不如code寫好一點 07/30 19:08
Sidney0503: 基本上C往下挖就是組合語言 組合語言往下挖就是CPU 07/30 19:09
Sidney0503: 硬體架構會基於軟體 軟體會被硬體牽制 07/30 19:10
Sidney0503: 就算有你所謂的"未來架構" 那也會有"未來指令" 07/30 19:11
Sidney0503: 有"編譯器"的理論在 就會有對應的語言 07/30 19:11
wtchen: 在使用bit-field的時候endianness也要考慮進去 07/30 19:22
netsphere: type-safty表示 07/30 19:22
wtchen: (就可攜性來說,使用bit-field已經有點危險了) 07/30 19:23
wtchen: 全部type都變成bit-field,考慮到endianness結果有點可怕 07/30 19:24
我沒想到bit field會牽扯到endianness... 這部分我之後再看
descent: 我現在會用 type unsigned int u32, 然後用 u32 07/30 21:51
descent: 不想直接用 unsigned int 這樣的用法了 07/30 21:51
descent: 最近踩一堆雷 07/30 21:52
可是unsigned int也不保證是32 bit 你不用uint32_t或uint_least32_t (話說有非用uint32_t不可的例子嗎?)
LiloHuang: 樓上改用 stdint.h 的 uint32_t 呢 07/30 22:49
descent: 字太多, 打起來累人, u32, u8, u16, 你打一個我打3個 07/30 22:54
LiloHuang: 個人覺得 C99 標準能用則用,打字累人則是另一回事了XD 07/30 23:01
wtchen: 為啥不typedef uint32_t u32,這樣不是安全些? 07/30 23:11
對阿 descent不考慮嗎?
yvb: int 7:xxx; ==> union { int yyy:7 } xxx; 07/30 23:23
yvb: 然後再 #define xxx xxx.yyy 07/30 23:24
yvb: 接著 xxx = 127; ==> ok; xxx = 128; ==> warning 07/30 23:25
yvb: 當然若考慮 define 可能會有額外風險, 就直接用 xxx.yyy . 07/30 23:27
這是另一種做法,可是寫起來很麻煩 而且還有用macro,實在不是好方法
CoNsTaR: 可是樓上 xxx = func(); 預設是不會 warning 的 就算 fun 07/30 23:29
CoNsTaR: c 回傳常數 128 也一樣 07/30 23:29
yvb: 當然 , struct { int yyy:7 } xxx; 一樣效果. 07/30 23:30
yvb: 語法本身不提供 int:7 寫法, 轉個彎換寫法效果一樣. 07/30 23:31
yvb: 當然, 其中的 int yyy:7 和 long long yyy:7 應該會相同; 07/30 23:37
yvb: 但寫 char yyy:7 或 short yyy:7 會不同(前提用 32 bit 機器) 07/30 23:39
yvb: 上兩句可能和機器及編譯器,甚至編譯選項相關, 請忽略. 07/30 23:44
yvb: 回 CoNsTaR: 只是驗證是有 int:7 效果, 設128去印應該會是0. 07/30 23:47
kevingwn: 省空間是說想要vector<int6_t>這樣的操作嗎?應該是辦得 07/30 23:52
沒有想到這喔 我指的省空間是 如果是int:4和int:10 那可以擺在一起變成int:16(2個合起來,是至少14) 可是如果是現有的寫法,就是char和int 那這樣就是至少24 bit 兩個就差10 bit了 當然現有的做法可以用struct去包,可是那樣太麻煩了
kevingwn: 到,但效能應該比vector<int8_t>差很多 07/30 23:53
kevingwn: 通常只有在存成檔案或網路傳輸等會有這樣的需求吧? 07/30 23:55
TobyH4cker: 看來沒寫過組語 07/31 00:02
TobyH4cker: 哦,看懂了,不過我覺得指明跟不指明沒差,因為本來 07/31 00:16
TobyH4cker: 就是要看文件,把文件的規範讀的很精熟的話,coding 07/31 00:16
TobyH4cker: 起來比較容易 07/31 00:16
我知道 但如果能夠在不看文件下,能夠提高讀懂code的可能性,這樣就更好了
TobyH4cker: 至於你說那些新手,或是老手都還不知道實際大小那些 07/31 00:18
TobyH4cker: ,只是表面他們學得不夠或看得不夠而已 07/31 00:18
TobyH4cker: 但是你的想法其實可以帶來一個好處,就是整數型態就 07/31 00:23
TobyH4cker: 只要有int跟uint就夠了,手動指定最小bit數,compile 07/31 00:23
其實我是比較希望只有int啦 如果要增加uint,那我覺得就要有3種型態,分別是 sint //包含負數 int //不在意正負數。當作buf時,用這個最好 uint //只包含正數
TobyH4cker: r來安排它要用多大空間這樣,吧? 07/31 00:23
bingo! 就是bit field 只不過不用包在struct
TobyH4cker: 嗯嗯那signed跟unsigned你會怎麼做0.0 07/31 15:35
目前應該會用 只有int,然後signed跟unsigned要在讀或寫時來決定 或 有int、sint、uint
wtchen: 還有一個問題,怎麼判斷是否overflow? 07/31 16:20
照常理來說,應該是不會overflow才對 因為你需要知道你的input的值的range 如果不知道,我們可以定義 sintmax_t //能表示的最小負數 uintmax_t //能表示的最大正數 如果連用這個都還能overflow,那表示就算用現在的做法(size_t),也還是會overflow
wtchen: 這樣搞的話要弄一個header把所有可能的max/min define進去 07/31 16:21
不 只要提供這2個就可以了 頂多就是再提供intptr_t這東西 不過我之後想跟各位討論,pointer存在的必要性就是了...
CoNsTaR: 樓上這麼做的優點就是不用考慮 overflow 啊… 07/31 17:05
CoNsTaR: 你已經知道它在這個程式裡有可能被賦的最大最小值了 怎 07/31 17:06
CoNsTaR: 麼會 overflow 07/31 17:06
CoNsTaR: 我也認同原 po sint int uint 的構想 07/31 18:15
CoNsTaR: 只是我覺得 signed unsigned (原本是 modifier) 可以變 07/31 18:15
CoNsTaR: 成像是 const 那樣的東西(qualifier) 07/31 18:15
CoNsTaR: int (specifier) 本身可以儲存任何整數 但是一旦加了 sig 07/31 18:15
CoNsTaR: ned/unsigned 07/31 18:15
CoNsTaR: 你就不能賦 正/負 數給他 07/31 18:15
CoNsTaR: 就像加 const 一樣,你就不能賦 non-const 給他 07/31 18:15
轉型會是個問題 我是覺得照以下這兩個想法比較好 如果是int,然後signed跟unsigned要在讀或寫時來決定,那就不需要處理轉型 如果是int、sint、uint,那轉型就是按照現在的標準來做就好
CoNsTaR: 這麼做 int 的本質不會改變 但是編譯器會為你做額外的檢 07/31 18:15
CoNsTaR: 查,保證你沒有把不對的值賦給變數 07/31 18:15
CoNsTaR: 這樣的好處是,這三種型態實際上是一模一樣的,只是你給 07/31 18:15
CoNsTaR: 他們一些限制 07/31 18:15
CoNsTaR: 所以 int 裝得下的數字其他兩種一定也裝得下(不會 overfl 07/31 18:15
CoNsTaR: ow,cast 的時候 binary 值也不會改變) 07/31 18:15
CoNsTaR: 至於 casting 規則嘛…… 07/31 18:15
wtchen: 原創的使用者可以自訂範圍,只是如果多人一起編輯 07/31 18:17
wtchen: 恐怕會加深code的複雜度.... 07/31 18:18
CoNsTaR: w大 不太懂你的問題耶… 07/31 18:20
wtchen: <= 16 bit好解決,如果是> 16 bit 那還要記不同bit的最大 07/31 18:29
wtchen: 最小值? (我算術不好不能一眼看出來) 07/31 18:30
我想沒人能一眼就看出來,這應該不是問題才對...
wtchen: 除非一直用2進位或16進位,如果要轉到10進位就.... 07/31 18:30
wtchen: 至於bit field vs. endianness 可以看這裡: 07/31 18:41
CoNsTaR: 喔喔 其實沒有那麼複雜啊 因為只有某些特殊值的上下限是 07/31 19:01
CoNsTaR: 需要你手動定義的 像是 協定裡某個值的上下限/輸入輸出 07/31 19:01
CoNsTaR: 能接受的上下限 之類 剩下的其實都可以在編譯時期動態的 07/31 19:01
CoNsTaR: 決定 07/31 19:01
kevingwn: 用struct去包不會麻煩呀 http://ideone.com/EF6eUs 07/31 21:26
我的麻煩在那個. 如果語言能直接提供的話就好了 另外你的template寫法,很 厲 害 <(_ _)>
kevingwn: 倒是覺得vector<int4_t>比較困難 07/31 21:28
Sidney0503: 說真的我不懂你的需求 07/31 21:58
主旨的確有點不太清楚 但我要問的就是 為什麼不讓所有的int型態,都只能用bit field方式宣告(在不用struct的情況下) 好處是 1.可以很明確的表示,值的範圍 寫 int a; 跟 int:21 a; 後者在即使缺乏文件或註解的情況下,仍然知道a只需要用到21個bit 2.省空間(部份情況)
Sidney0503: 光你說擺再一起省空間 很想叫你去念計算機組織 07/31 21:59
這些概念都是只要求 至少 幾個bit 為什麼不能省空間...?
Sidney0503: 首先 管bit不是在管硬碟block 光是紀錄就要消耗多少 07/31 22:20
Sidney0503: 多少空間 其次先不談對齊問題 07/31 22:20
其實,我有一個疑問 我的作法只是把bit field拿來用 完全沒有新創的方法... 所以 缺點就是bit field的缺點 優點就是bit feild的優點 你講的這些我會再去查查看
Sidney0503: 你要如何設計一個CPU可以同時執行兩個指令? 07/31 22:21
Sidney0503: pipeline一次就是吃這麼多bit 你空下來又如何? 07/31 22:21
沒幹嘛 我提這點不是為了速度,主要是為了明確表示值的範圍
Sidney0503: 我覺得你拿去八卦版問比較好 人比較多 也不只C 07/31 22:23
Sidney0503: 說不定精通其他語言的人會幫你解答 07/31 22:23
拿去八卦版,感覺只會有一堆人亂回...
CoNsTaR: 樓上重點錯誤吧…… 07/31 22:36
yoco: 我覺得不是不行,只是沒有人寫 proposal 給標準委員會 07/31 22:39
yoco: 你寫一份吧 07/31 22:39
yoco: 就像 C++11 沒有 VAL,不是不行,單純只是沒人提 proposal 07/31 22:40
我倒是比較想提我之前說的bind+move 但一看到tuple+ C++17 apply,我就知道不用提了 XD
wtchen: Sidney0503講的是Write amplification嗎? 07/31 22:52
Sidney0503: 樓上說的是我其中一個想法 我真的想不到如何省空間.. 08/01 06:48
http://ideone.com/Y9zcrs 這樣你能理解嗎? B的做法,有些平台的size仍然會跟A一樣 但是C通常都會比A小
Sidney0503: 你現在又跟我說表示值的範圍 我最一開始就說很奇怪 08/01 06:49
我是覺得 我沒有"又"跟你說表示值的範圍... 表示值的範圍我一直都有說到
Sidney0503: 為甚麼值的範圍只能是2^n次方 根本就不符合使用 08/01 06:49
Sidney0503: 除了bool 大多數我們使用的數字範圍都不是2^n 08/01 06:50
Sidney0503: 天堂32767和戰神65535一看就知道是被硬體牽制 08/01 06:51
Sidney0503: 而不是使用需求才設這個範圍 08/01 06:51
Sidney0503: 這種邊界的問題生出物件的原則像JAVA慣用set和get 08/01 06:56
因為現在1個bit就只能表示0或1(所以才叫bit) 你如果要能夠表示任意範圍(不止2的倍數) 那你硬體上要怎麼設計? 我覺得用bit field來表示範圍,雖然沒有辦法每次都精準 但至少已經滿足我的需求了
Sidney0503: 原來你知道什麼叫硬體不好設計阿 我還以為你不知道耶 08/01 16:48
Sidney0503: 我已經跟你說了就是慣用的set和get會限制邊界 08/01 16:54
Sidney0503: 難不成我用你的API還要看每個變數的範圍? 08/01 16:55
wtchen: 以後量子電腦如果成功量產,1 bit 就能表示成0~7 08/01 17:21
wtchen: 搞不好C standard也要全部重新定義 08/01 17:22
chchwy: 就CPU的角度來說 你的建議完全不會增加效能 08/01 18:11
goliathplus: 因為沒有意義阿 硬體架構要 ALIGN 單一變數指定bit 08/05 00:02
goliathplus: 沒有顯著優點阿 08/05 00:02
tomjpsun: RAM 越來越大碗,連 embedded system 也有受惠, 所以十年 08/05 17:09
tomjpsun: 前是應該考慮這些,但是現在其實容易 maintain 可能比較 08/05 17:12
tomjpsun: 重要吧! 08/05 17:12
jeff04209: 你cache怎麼放?memory 怎麼放?拿資料一次要拿多少? 08/12 18:55
jeff04209: 你處理器每次拿資料都要用額外的邏輯去判斷,這個複雜 08/12 18:55
jeff04209: 度... 08/12 18:55
jeff04209: 你以為你高階語言想怎麼寫就怎麼寫喔,硬體為了這點沒 08/12 18:58
jeff04209: 什麼幫助的功能所耗的cost有多大你知道嗎 08/12 18:58
我覺得我文章寫得一定不好,不然就不會有人提到一些其他方面的問題 我在文章裡面說明了,如果compiler沒辦法提供這功能,那就只要無視它就好 我要的是把bit field的功能,在平常變數宣告時就可以使用,而不用放在struct裡面 如果你們覺得這功能很沒用、一點都不會增進效能、只會增加硬體實作困難 那為什麼C還要提供bit field的功能? 有些人回覆說硬體架構很難做之類的,我可以接受 但是這問題都是早就被解決的,不然bit field早就不存在了
jun0325: 硬體沒有難不難做...只是要看compiler和硬體要如何合作罷 08/17 01:10
jun0325: 了。就算你新增了bit field的語意,要讓它跑在原本的CPU 08/17 01:10
jun0325: 也是可以,就只是讓compiler增加原本的工作去support你要 08/17 01:10
jun0325: 的語意,用原本的ISA去拼出你想要的functionality,反之 08/17 01:10
jun0325: 亦然,可以extend ISA減少compiler的工作。 08/17 01:10
jun0325: 不過要讓不同長度的變數pack到同一個register裡,你要讓 08/17 01:18
jun0325: 硬體如何對其中一個變數做運算XD。我能想到最接近的概念 08/17 01:18
jun0325: 就是SSE了。 08/17 01:18
jun0325: 可以參考這http://goo.gl/ahdejN讓你對register packing 08/17 01:23
jun0325: 會比較有概念 08/17 01:23
Sidney0503: 那是struct 每一次使用就是會要一整個區塊空間 08/24 08:43
Sidney0503: 就算你變數真的用bit field 也是每次要一個變數的空間 08/24 08:44
Sidney0503: 不會省空間 08/24 08:44
Sidney0503: struct大太 就是倍數整區塊 08/24 08:45
Sidney0503: 怕你不懂 假設八位元 struct要到的空間就是 08/24 08:46
Sidney0503: 總 bit數/8 取天花板 *8 ok? 08/24 08:47
Sidney0503: 打包一群變數 可以靠命命開頭讓人知道是同群組資料 08/24 08:48
Sidney0503: struct是連硬體位置都連在一起 08/24 08:49
Sidney0503: 只能說你對c/組合語言/計算機架構完全沒概念 08/24 08:51
Sidney0503: 在你好好念書之前 你永遠都無法理解你的14+2=16bit 08/24 08:53
Sidney0503: 是多外行的說法 08/24 08:53
有多外行? 從這code來說,http://ideone.com/Y9zcrs A的size是4,B跟C的size是2 用了bit field後,B跟C的size的確小於A 我說用bit field可以省空間,到底哪裡有問題?
Sidney0503: 而硬體連續性也是陣列最重要的 因為struct把變數 08/24 09:04
Sidney0503: 的空間連續 陣列才能取用struct裡面的面數 08/24 09:05
Sidney0503: 用命名開頭表示群組 會被compiler打散 效能自然差 08/24 09:07
int a; //do something int b; //do something int c; 如果每個人都是要用到該變數時才宣告,那這樣子的bit field就沒用 可是,隨便翻一堆code,大部分都是先把會用到的變數宣告在一開始,如下 int a; int b; int c; //do something 那這樣compiler可以嘗試把a b c當作一個struct來包,然後就可以直接套用bit field (這前提當然是,a、b、c可以在struct外面使用bit field) 如果你跟我說,因為上面那原因,導致這想法不夠實際,所以這方法不會被採用 但實際情況不是這樣啊 寫下面那種形式的人比上面多很多 這功能可能很雞肋,但它至少還是有能用的地方的
Sidney0503: 比起在這邊跟板友筆戰 不如先好好念底層的原理 08/24 09:10
EdisonX: 亂入一下,C++ 是建議變數用到時才宣告,所以是建議第一種 08/25 23:11
我猜會用第二種的原因,應該是很多人從C那邊轉來,所以才寫下面那種方法吧
EdisonX: 對,早期c所有宣告必須放在 Block 最前面 08/27 08:56
EdisonX: 但新標準已沒差了 (不過寫 FW 還是一樣) 08/27 08:57
EdisonX: 如果是要省空間的話,看過用 union 來省 08/27 08:58
話說C++17提供std::variant,來取代union ※ 編輯: Caesar08 (1.164.42.156), 08/27/2016 09:42:03