typedef __packed struct
struct常用在資料結構中。而struct的位元組對齊方式對於嵌入式底層的程式設計師來講是必須掌握的。現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。
對齊的作用和原因:各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問 乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為32位系統)如果存放在偶位址開始的地方,那麼乙個讀週期就可以讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。
c/c++語言中struct結構體定義中__packed的作用是什麼?
例如**為:
typedef struct __packed test_s
test_t;
(1)__packed是位元組對齊的意思。比如說int float double char它的總大小是4 + 4 + 8 + 1 = 17,但如果不用__packed的話,系統將以預設的方式對齊(假設是4位元組),那麼它佔4 + 4 + 8 + 4 = 20;(不足4位元組以4位元組補齊)。
(2)在vs2008上述方法不能用了,如果想設定對齊方式,只要選擇工程屬性->配置屬性->c/c++->**生成就能設定,它的選項有1、2、4、8、16。在gcc下,可以在加上#pragma pack(4) 4位元組對齊的意思,其它同理。
#pragma pack (1) /*指定按1位元組對齊*/
#pragma pack () /*取消指定對齊,恢復預設對齊*/
__packed是進行一位元組對齊。使用_packed一般會以降低執行效能為代價,由於大多數cpu處理資料在合適的位元組邊界數的情況下會更有效,packed的使用會破壞這種自然的邊界數。
struct packed-data
data;
其中冒號表示啥意思?
c語言中,這叫 「位段」,c語言允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單位的成員稱為「位段」或稱「位域」( bit field) 。利用位段能夠用較少的位數儲存資料。
冒號出現在struct結構當中表示只占用8位中的n位。也就是說,假如有如下**:
unsigned a1:1;
unsigned a2:2;
a1變數的範圍為 0 1 ,a2的範圍就是 0,1,2, C語言結構體中的位段
c語言結構體中的位段 位段的記憶體分配 位段的成員可以是 int unsigned int signed int 或者是 char 屬於整形家族 型別 位段的空間上是按照需要以4個位元組 int 或者1個位元組 char 的方式來開闢的。位段涉及很多不確定因素,位段是不跨平台的,注重可移植的程式應該...
c語言結構體例項使用 位段結構體
一 位段結構體介紹 位段結構體就是按位讀寫,c語言提供了專門的結構體方式 二 位段結構體定義 struct struct status 三 位段結構體訪問 status.widthvalidated 0 printf d status.widthvalidated 四 工程例項 需求 當前有個32位...
結構體之位域詳解(C語言結構體中的冒號)
在資料儲存時,有些時候並不需要占用乙個完整的位元組,比如數值 1,只需要占用乙個bit 二進位制 1 數值2 只需占用2個bit 二進位制 10 在這樣不需要太多bit來表示乙個數值時候,為了節省儲存空間,c語言提供了一種資料結構,稱之為 位域 允許在程式中按照其網域名稱進行操作,這樣就可以使得多個...