麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

解析C語言中位字段內存分配的問題

2020-01-26 16:13:45
字體:
來源:轉載
供稿:網友

C語言的位字段是個比較有意思的特性。它的目的是在一個機器字中保存多個對象(每個對象占據若干bit),從而節省內存資源,同時又避免復雜的位運算。在此不再討論位字段的具體語法,下面將研究位字段的存儲特性。

先說含有多個字段(field)的字(word)所占空間的規律――含有多個字段的字的大小是所有字段的類型中的最長的那個的倍數。但要確定究竟是最長類型的幾倍則比較復雜,這要看是否需要考慮類型對齊問題(即一個字段能否跨越兩個最長類型)。

例1:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 4;
};

前兩個字段都是char類型,第三個是int類型,所有類型中最長的是int類型。所以字的大小是int類型長度(即4字節)的倍數。而size of word的結果是4字節(即int的1倍),這是因為word的三個字段總共7位(1+2+4),小于int的32位,且不需 考慮類型對齊問題。

例2:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 30;
};

與上例一樣, 所有 類型中最長的是 int類型。所以字的大小是int類型長度(即4字節)的倍數。而size of word的結果是8字節(即int的2倍),這是因為word的三個字段總共33位(1+2+30),需要兩個int的64位才能裝下, 且不需 考慮類型對齊問題。

例3:

struct word {
char  field1 : 3;
char  field2 : 6;
char  field3 : 3;
};

所有 類型中最長的是 char類型。所以字的大小是char類型長度(即1字節)的倍數。在linux下size of word的結果是3字節(即char的3倍)。如果只考慮word的三個字段總共12位(3+6+3),需要兩個char的16位即能裝下,但是在linux的gcc實現下,第二個字段不能跨越兩個char(為了對齊),所以三個字段各占一個字節。共3字節。但 一個字段能否跨越兩個最長類型是由具體的實現決定的。

其次,我們討論word內各個field的存儲,這個和具體的實現有關。有的是從左向右分配的,有的是從右向左分配的。這個沒有規律可言。

最后,對word中的field不能進行取地址操作,這是因為指針需要對齊。但可以對word進行取地址操作。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: av在线更新 | 黄色片免费在线播放 | 毛片免费观看视频 | 欧美成人黄色小视频 | 99成人在线 | free国产hd老熟bbw | 成人午夜在线免费视频 | 日美黄色片 | 99国产精品白浆在线观看免费 | 一区www| 日本在线播放一区二区三区 | 成人在线视频免费播放 | 久久免费视频7 | 九九热在线免费观看视频 | 欧美精品久久久久久久久久 | 久久精品国产一区二区 | 欧美一级高清免费 | 777sesese| 成人羞羞网站入口 | 毛片免费网 | av不卡免费在线观看 | 欧美成人小视频 | 99精品视频免费看 | 香蕉久草视频 | 中国大陆一级毛片 | 成人精品免费看 | 久久久精品精品 | 成人 精品 | 久久福利精品 | 最新在线中文字幕 | 久久久久电影网站 | 狠狠干夜夜操 | 亚洲特黄 | 蜜桃一本色道久久综合亚洲精品冫 | 国产91久久精品一区二区 | 精品久久久久久久久久久久久久久久久久久 | 本色视频aaaaaa一级网站 | 一级做受毛片免费大片 | 国内成人自拍视频 | 激情在线观看视频 | 91av日韩 |