中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現位段機制

發布時間:2022-02-14 14:41:38 來源:億速云 閱讀:150 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“C語言如何實現位段機制”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C語言如何實現位段機制”這篇文章吧。

概念

什么是位段?

位段又稱為位域,C語言允許在一個結構體中以位為單位來指定其成員所占內存長度,這種以位為單位的成員就叫做稱為位段( bit field) 。利用位段能夠用較少的位數存儲數據達到節省空間的目的。

位段是結構體特有的,所以聲明是和結構是類似的,但有兩個不同:

1. 位段成員必須是 int ,unsigned int,signed int

2. 位段成員名后邊結構包括一個冒號和整型數字

舉個栗子:

struct haha
{
    unsigned int ch   : 8;    //8位
    unsigned int chh : 6;    //6位
    unsigned int chhh : 18;   //18位
};
struct haha dest;

內存分配

這里的 haha 就是一個位段的類型,這個神神秘秘的位段咱不常見,那么他的大小怎么算的呢?其實和結構體是一樣的:

struct arr
{
int a:2;
int b:5;
int c:10;
int d:30;
};
int main()
{
printf("%d\n",sizeof(struct arr));
return 0;
}

C語言如何實現位段機制

這里 a:2什么意思呢?

成員 a 只占 2 個比特位,后面同理,既然這樣,那我們總計 47 比特位,也就是 6 個字節 48 個比特位已經足夠了,那為什么又是 8 呢?位段的內存分配到底是怎樣的?

這里千萬不要犯低級錯誤誤認為他的大小就是 47 個比特位,和前一篇博客敘述原理相同,因為都是 int 類型,所有成員會向 int 看齊,int 是四字節,默認 8 字節,對齊數取 4 字節,a+b < 1字節,合并申請 1 字節空間,后面都需要獨立申請空間,總計 1+2+4 = 7字節,結構體大小必須是最大對齊數整數倍,取 4 的整數倍就是 8,因此為 8 字節。

位段跨平臺問題

我們細想剛剛這種機制,a,b,c,d 分別為 2,5,10,30 比特位,而我一個字節是 8 個比特位,假若在給 a 分配了 1 字節后,還剩 6 比特位,這 6 個位子我要不要讓給二哥 b 成員來享用呢?==我是一字節一字節榨干資本還是出手闊綽安排"單人房"呢?==這里就有了歧義。

要知道位段在空間上是按照需要以四字節 int 或一字節 char 的方式來開辟空間,他涉及很多的不確定性因素,這就是為什么位段是不跨平臺的,注重可移植性的程序應該避免使用位段。

有什么不確定因素呢,就好比我們剛剛提到的內存分配問題,這個問題連C語言標準都沒有規定我到底該怎么利用,需要由具體的編譯器環境決定,編譯器環境又依賴于不同的平臺比如 Linux 是 gcc 標準,VS則是 windows 標準。

我們要知道:

  • 1. int 位段被當成有符號數還是無符號數是不確定的。

  • 2. 位段中最大位的數目不能確定(16位機器最大 16,32 位機器最大 32)。

  • 3. 位段中成員的內存從左到右分配還是從右向左分配標準尚未定義。

  • 4. 當一個結構中包含兩個位段時,第二個位段成員比較大,無法容納第一個位段剩余的位時,是應當舍棄還是利用,標準尚未定義。

作用

“ 這么個玄乎的玩意兒拿來干嘛啊 ”你可能會有這樣的疑問

我們拿上面的情景來分析一手:

int a:2;
int b:5;
int c:10;
int d:30;

我們不分配位段時,需要 16 個字節,分配后只要 8 個字節,其實位段就是為了節省空間,充當個省流大師。

位段使用的前提條件就是某些細節需要非常明確,假如我成員 a 的取值只有四種狀態:00,01,10,11,那我給 a 分配 2 個字節是不是就足夠了,那我就給 2 個,我如果一上手啪嘰就是一個 int 類型,32 個字節橫空出世,這個節省的性價比可不低哦~

當然萬事萬物不可能十全十美,我幫你節省但總歸會有一定浪費,這是不可避免的。總結一下就是位段跟結構相比,可以達到相同效果且可以有效節省空間,但存在跨平臺問題存在。

Tip

注意,位段機制跟棧還扯不上關系,入棧的是數據的字節,位段是在這些字節的內部空間上發揮作用,已經細節到“位”了,以及之前提到的大小端模式,大小端是連續字節數據的存放模式,也細化不到字節上。

應用場景

位段在實際生活中也有廣泛的應用,比如我們網絡上數據包的格式:

C語言如何實現位段機制


這就是我們在互聯網上向某個對象發送信息的原理,里面最大的問題就是這個包如果直接扔到網上去,就會像拖拉機上高速,鐵鐵的堵車造成網絡擁擠,我們就會利用位段機制進行適當縮減以減小網絡的負擔。

以上是“C語言如何實現位段機制”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尖扎县| 普安县| 岱山县| 阳曲县| 三明市| 祁东县| 浦城县| 林甸县| 库尔勒市| 遵义市| 鱼台县| 巫溪县| 扬州市| 浮山县| 安仁县| 黄山市| 门源| 山东省| 耿马| 阳泉市| 宜丰县| 阆中市| 容城县| 东宁县| 高邮市| 云和县| 芮城县| 镇赉县| 浠水县| 鹤壁市| 东海县| 吴桥县| 托克托县| 论坛| 板桥市| 西宁市| 桑日县| 广水市| 左权县| 同仁县| 昭平县|