[英]Bit-Sized structure field
我有兩個問題:
這段代碼:
struct employee
{
char name[20];
int married :1;
};
已婚的人要記多少次?
如果我有多個位大小的字段,將它們放在相同的變量中以保持它們的獨立性是否很好?
喜歡:
struct employee
{
char name[31];
int married :1;
int manager :2;
int children :4;
};
要么
struct employee
{
char name[31];
int flage; /* one bit for married, one for manager, and 4 bits for children */
};
哪一個在內存使用方面更好,為什么?
已婚的人要記多少次?
int : 1
在sizeof(int)
的存儲單元中占用一位內存。 請注意,因為int
是帶符號的,並且位域只有一位,所以這樣的位域只能采用兩個值:-1和0。
這取決於編譯器,還可能取決於您在構建時為編譯器提供的選項。
緊密打包字段可能會降低訪問性能,同時提高存儲效率,因此,如果您告訴編譯器進行速度優化,則它可能會更改。
位域在內存中永遠不能占用少於CHAR_BITS
位,因為否則每個struct
實例的起始地址都不會落在確切的char
地址上,而必須這樣做。
所以第一個例子:
struct employee
{
char name[20];
int married :1;
};
假設您的系統上的sizeof (int)
為4,則可能意味着sizeof (struct employee)
占用了24個字節。 這意味着,如果您在married
后添加了更多的位域成員,則大小不會改變,直到您添加了31位的域。
當您使用int flage
存儲有關已婚經理和子女的信息時,可能會為一個對象占用2個字節的內存 ,並且每次您必須訪問特定信息時,都必須對flage
變量執行按位運算 。 因此,這將需要一些處理。
通過使用位域,例如int married:1;
(最好使用unsigned int
),這意味着它可能只占用1個字節的內存 ,因此可以節省內存(假設您的結構未填充)。 另外,您可以直接訪問其位 。
因此,對於內存和處理,這應該是更好的方法。
選擇最容易閱讀的哪個,最准確地抓住您的編碼意圖。 這種微優化的說法是完全不合適的。 如果您處於性能至關重要的內部循環中,則可能會變得很重要,但是隨后其他技術(例如算法),CPU的緩存性能,循環展開,循環流水線處理等也會影響到其他技術。
只是重申一下:將要閱讀您的代碼的人的代碼。
您甚至可能會考慮以下內容:
struct employee
{
char name[31];
bool married;
enum manager_t manager;
...
};
如果您嘗試將bool
(例如)分配給employee::manager
,編譯器會在此處警告您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.