C C 節約儲存資料空間的方法 位域

2021-10-06 09:46:40 字數 1400 閱讀 9912

有些時候,根據乙個資料的取值範圍(主要看最大取值),其在儲存時並不需要占用乙個完整的位元組,只需要占用乙個或幾個二進位制位即可。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。為了節省儲存空間,並使處理簡便,c/c++語言又提供了一種資料結構,叫做「位域」或「位段」。位域的定義和位域變數的說明位域定義與結構定義相仿。

struct 位域結構名  ; 

其中位域列表的形式為: 型別說明符 位網域名稱:位域長度。 

比如,我們想用乙個struct來表示年-月-日,由於我們知道月份的取值範圍是1-12,用4bit就可以表示;日的取值範圍是1-31,用5bit就可以表示。這樣我們就可以這樣來定義struct data_1,只需要占用4byte就可以儲存。

struct data_1  // sizeof(data_1) = 4 

;

再比如,有8個開關量,可以用位域來表示。

struct test_1    // sizeof(test_1) = 1

;

關於位域的使用,有以下幾個規則:

位域可以無位網域名稱,這時它只用來作填充或調整位置。無名的位域是不能使用的。

位域的長度不能大於資料型別本身的長度,比如int型別就不能超過32位。

不能對位域進行 取位址操作

可以直接對位域進行賦值,但要注意賦的值不要超過位域的最大值範圍,否則會出現溢位,如果cout,得到的是截斷後的值。

關於使用位域時,記憶體對齊及儲存大小,有以下規則。

如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止

如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++,gcc採取壓縮方式;

如果位域字段之間穿插著非位域字段,則不進行壓縮;

整個結構體的總大小為最寬基本型別成員大小的整數倍。資料對齊,請參考我之前的部落格

參考 

#include using namespace std;

struct data

;struct data_1

;struct test

;struct test_1

;struct pack

;int main(int argc, char** ar**)

{ cout<< "sizeof data = "sizeof data = 8

sizeof data_1 = 4

sizeof test = 8

sizeof test_1 = 1

sizeof pack = 8

t_1.c = 36

節約空間的篩素數方法

節約空間的篩素數方法 求不超過n的所有素數,比較好的演算法是埃拉託斯特尼篩法 給出要篩數值的範圍n,找出 sqrt以內的素數p p dots,p 先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷...

C C 中的位域 bit field

位域是c c 中常用的資料結構。在某些情況下合理的使用位域可以節省儲存空間,提高執行效率並提高程式的可讀行。按照我以往的程式設計經驗來看,通常以下情況下會優先考慮使用位域。1 有很多的狀態標記,需要集中儲存,比如tcp鏈結 的狀態 2 協議棧相關的資料結構,尤其是底層通訊協議中很多情況使用乙個或者幾...

節約資料中心空間的5種策略

節約資料中心內的空間可以帶來諸多的好處 節約空間意味著可以節省開支。在減少了所使用的空間的同時,還可以減少所需的電源 用水 照明和冷卻,這便可以節省支出。在對空間的消耗進行控制同時,也能確保具有充足的空間來滿足未來增長和擴充套件的需求。資料中心節約的空間越多,則具有越多的空間以在 裝置周圍方便的活動...