[討論] 讓programmer控制variable所需的bit數?
看板C_and_CPP (C/C++)作者Caesar08 (Caesar)時間8年前 (2016/07/30 14:55)推噓32(36推 4噓 146→)留言186則, 20人參與討論串1/2 (看更多)
我很好奇,像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
推
07/30 15:06, , 1F
07/30 15:06, 1F
→
07/30 15:06, , 2F
07/30 15:06, 2F
對阿,我知道有bit-field
只是覺得為什麼不要全部的variable都採用bit-field
除此之外,有時候只需要表達一些狀態(例如表達0-31),卻需要用char去存
或是有時候可能只需要21個bit,卻需要用long去存
不覺得這樣很浪費嗎?
(而且沒辦法一眼就看出,到底這個variable的range是多少)
→
07/30 15:07, , 3F
07/30 15:07, 3F
我沒想到alignment的問題...
但是如果原本做不到alignment,換成這種做法,反而有可能做得到不是嗎?
如果仍然做不到,那也會用padding來避免效能更差
所以從alignment方面來看,這麼做應該是不會效能更差吧?
推
07/30 15:11, , 4F
07/30 15:11, 4F
恩...
所以這樣做的好處可能就不是在效能上,而是在語意的表達上
用這種方式,能更清楚說明,這個variable的值的範圍
→
07/30 15:49, , 5F
07/30 15:49, 5F
可是變數命名不是我能決定的...
如果是用這種方法,那就是強制的了
→
07/30 16:13, , 6F
07/30 16:13, 6F
會改成這樣,表示新的做法的bit數一定<=現有做法的bit數
那表示說新做法的bit數,一定可以靠padding,來變回現有做法的bit數
那也就是說,現有做法能夠做到的事情(例如alignment),新的做法一定做得到
那這樣alignment所引起的效能問題就不存在了
我的理解是這樣啦
→
07/30 16:13, , 7F
07/30 16:13, 7F
→
07/30 16:14, , 8F
07/30 16:14, 8F
我其實有個問題是
如果未來的硬體實作都改變的話,那怎麼辦?
與其到時候才改標準,不如現在把標準弄得更彈性一點,不是比較好嗎?
反正對於那些主流的硬體,其實沒什麼不同
對於那些特殊的硬體,至少它現在可以說,能支援C語言
→
07/30 16:15, , 9F
07/30 16:15, 9F
→
07/30 16:16, , 10F
07/30 16:16, 10F
→
07/30 16:19, , 11F
07/30 16:19, 11F
→
07/30 16:20, , 12F
07/30 16:20, 12F
推
07/30 17:18, , 13F
07/30 17:18, 13F
大概就是 可以一眼就知道值的範圍
QQ 突然覺得這樣好沒用...
推
07/30 17:23, , 14F
07/30 17:23, 14F
→
07/30 17:23, , 15F
07/30 17:23, 15F
→
07/30 17:23, , 16F
07/30 17:23, 16F
→
07/30 17:23, , 17F
07/30 17:23, 17F
→
07/30 17:23, , 18F
07/30 17:23, 18F
→
07/30 17:23, , 19F
07/30 17:23, 19F
→
07/30 17:23, , 20F
07/30 17:23, 20F
→
07/30 17:23, , 21F
07/30 17:23, 21F
如果靠programmer能做得更好的,應該就讓programmer去做
舉例來說,假設我很確定使用者的輸入介於0~7
那我可以宣告
int:3 a;
來存放這個input
可是如果用現有做法,就是
char a;
那這樣programmer在讀我code的時候,前者所能表達的意思比後者更多(如果不用註解)
(當然也可以用struct包起來,但大概沒人會願意這麼做)
只用int跟double這方法很不錯(再加一個bool),希望C++能改成這樣 XD
→
07/30 17:23, , 22F
07/30 17:23, 22F
→
07/30 17:23, , 23F
07/30 17:23, 23F
→
07/30 17:23, , 24F
07/30 17:23, 24F
不做太多->programmer要寫比較多code
所以我的提案也蠻符合的吧?
→
07/30 17:23, , 25F
07/30 17:23, 25F
推
07/30 17:26, , 26F
07/30 17:26, 26F
→
07/30 17:26, , 27F
07/30 17:26, 27F
推
07/30 17:51, , 28F
07/30 17:51, 28F
→
07/30 17:52, , 29F
07/30 17:52, 29F
→
07/30 17:52, , 30F
07/30 17:52, 30F
還有 121 則推文
還有 28 段內文
→
08/05 17:12, , 152F
08/05 17:12, 152F
推
08/12 18:55, , 153F
08/12 18:55, 153F
→
08/12 18:55, , 154F
08/12 18:55, 154F
→
08/12 18:55, , 155F
08/12 18:55, 155F
推
08/12 18:58, , 156F
08/12 18:58, 156F
→
08/12 18:58, , 157F
08/12 18:58, 157F
我覺得我文章寫得一定不好,不然就不會有人提到一些其他方面的問題
我在文章裡面說明了,如果compiler沒辦法提供這功能,那就只要無視它就好
我要的是把bit field的功能,在平常變數宣告時就可以使用,而不用放在struct裡面
如果你們覺得這功能很沒用、一點都不會增進效能、只會增加硬體實作困難
那為什麼C還要提供bit field的功能?
有些人回覆說硬體架構很難做之類的,我可以接受
但是這問題都是早就被解決的,不然bit field早就不存在了
→
08/17 01:10, , 158F
08/17 01:10, 158F
→
08/17 01:10, , 159F
08/17 01:10, 159F
→
08/17 01:10, , 160F
08/17 01:10, 160F
→
08/17 01:10, , 161F
08/17 01:10, 161F
→
08/17 01:10, , 162F
08/17 01:10, 162F
→
08/17 01:18, , 163F
08/17 01:18, 163F
→
08/17 01:18, , 164F
08/17 01:18, 164F
→
08/17 01:18, , 165F
08/17 01:18, 165F
→
08/17 01:23, , 166F
08/17 01:23, 166F
→
08/17 01:23, , 167F
08/17 01:23, 167F
噓
08/24 08:43, , 168F
08/24 08:43, 168F
→
08/24 08:44, , 169F
08/24 08:44, 169F
→
08/24 08:44, , 170F
08/24 08:44, 170F
→
08/24 08:45, , 171F
08/24 08:45, 171F
→
08/24 08:46, , 172F
08/24 08:46, 172F
→
08/24 08:47, , 173F
08/24 08:47, 173F
→
08/24 08:48, , 174F
08/24 08:48, 174F
→
08/24 08:49, , 175F
08/24 08:49, 175F
→
08/24 08:51, , 176F
08/24 08:51, 176F
→
08/24 08:53, , 177F
08/24 08:53, 177F
→
08/24 08:53, , 178F
08/24 08:53, 178F
有多外行?
從這code來說,http://ideone.com/Y9zcrs
A的size是4,B跟C的size是2
用了bit field後,B跟C的size的確小於A
我說用bit field可以省空間,到底哪裡有問題?
噓
08/24 09:04, , 179F
08/24 09:04, 179F
→
08/24 09:05, , 180F
08/24 09:05, 180F
→
08/24 09:07, , 181F
08/24 09:07, 181F
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)
如果你跟我說,因為上面那原因,導致這想法不夠實際,所以這方法不會被採用
但實際情況不是這樣啊
寫下面那種形式的人比上面多很多
這功能可能很雞肋,但它至少還是有能用的地方的
噓
08/24 09:10, , 182F
08/24 09:10, 182F
→
08/25 23:11, , 183F
08/25 23:11, 183F
我猜會用第二種的原因,應該是很多人從C那邊轉來,所以才寫下面那種方法吧
推
08/27 08:56, , 184F
08/27 08:56, 184F
→
08/27 08:57, , 185F
08/27 08:57, 185F
→
08/27 08:58, , 186F
08/27 08:58, 186F
話說C++17提供std::variant,來取代union
※ 編輯: Caesar08 (1.164.42.156), 08/27/2016 09:42:03
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章