最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言位段(位域)機制結構體的特殊實現(xiàn)及解析

 更新時間:2022年02月14日 09:56:26   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了C語言位段位域機制結構體的特殊實現(xiàn)講解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

概念

什么是位段?

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

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

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

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

舉個栗子:

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;
}

在這里插入圖片描述

這里 a:2什么意思呢?

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

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

位段跨平臺問題

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

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

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

我們要知道:

  • 1. int 位段被當成有符號數(shù)還是無符號數(shù)是不確定的。
  • 2. 位段中最大位的數(shù)目不能確定(16位機器最大 16,32 位機器最大 32)。
  • 3. 位段中成員的內存從左到右分配還是從右向左分配標準尚未定義。
  • 4. 當一個結構中包含兩個位段時,第二個位段成員比較大,無法容納第一個位段剩余的位時,是應當舍棄還是利用,標準尚未定義。

作用

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

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

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

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

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

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

Tip

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

應用場景

位段在實際生活中也有廣泛的應用,比如我們網(wǎng)絡上數(shù)據(jù)包的格式:

在這里插入圖片描述


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

今天就到這里吧,摸了家人們。

以上就是C語言位段(位域)機制結構體的特殊實現(xiàn)及解析的詳細內容,更多關于C語言位段位域機制結構體的資料請關注腳本之家其它相關文章!

相關文章

  • C與C++之間相互調用實例方法講解

    C與C++之間相互調用實例方法講解

    這篇文章主要介紹了C與C++之間相互調用的實例方法,大家參考使用吧
    2013-12-12
  • C++進程間共享數(shù)據(jù)實例

    C++進程間共享數(shù)據(jù)實例

    這篇文章主要介紹了C++進程間共享數(shù)據(jù)的方法,是進行C++應用程序開發(fā)中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C語言鏈表完整操作演示

    C語言鏈表完整操作演示

    這篇文章主要為大家詳細介紹了C語言鏈表的完整操作演示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++中的拷貝構造詳解

    C++中的拷貝構造詳解

    這篇文章主要為大家介紹了C++中的拷貝構造,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 詳細分析C++ 異常處理

    詳細分析C++ 異常處理

    這篇文章主要介紹了C++ 異常處理的的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C語言實現(xiàn)停車場項目

    C語言實現(xiàn)停車場項目

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)停車場項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt無邊框窗口拖拽和陰影的實現(xiàn)

    Qt無邊框窗口拖拽和陰影的實現(xiàn)

    自定義窗口控件的無邊框,窗口事件由于沒有系統(tǒng)自帶邊框,無法實現(xiàn)拖拽拉伸等事件的處理,本文主要介紹了Qt無邊框窗口拖拽和陰影的實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • OpenCV實現(xiàn)簡易標定板

    OpenCV實現(xiàn)簡易標定板

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡易標定板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • ubuntu中打開終端的三種解決方法

    ubuntu中打開終端的三種解決方法

    本篇文章是對ubuntu中打開終端的三種方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言初識變量常量字符串轉義符及注釋方式簡介

    C語言初識變量常量字符串轉義符及注釋方式簡介

    最強的C語言筆記,此處對于C語言的基礎部分做一個簡要的介紹,作者實屬初學,寫博客也是作者學習的一個過程,若文中內容有理解不到位或者有不當之處,還請朋友們不吝指正
    2021-11-11

最新評論

盘山县| 郯城县| 古丈县| 合水县| 黎城县| 乐昌市| 郑州市| 蚌埠市| 辉南县| 印江| 天峻县| 分宜县| 昆山市| 西乌珠穆沁旗| 蒙自县| 京山县| 乌海市| 阳曲县| 黔西县| 左云县| 资中县| 全南县| 丰原市| 海阳市| 舒兰市| 文昌市| 桦南县| 杂多县| 锡林郭勒盟| 东台市| 龙山县| 华亭县| 安阳县| 太保市| 上饶县| 通海县| 滁州市| 白银市| 沈阳市| 瑞安市| 凤冈县|