位元組對齊 pragma pack

2022-06-28 03:09:14 字數 1179 閱讀 9473

這是給編譯器用的引數設定,有關結構體位元組對齊方式設定, #pragma pack是指定資料在記憶體中的對齊方式。

#pragma pack (n)             作用:c編譯器將按照n個位元組對齊。

#pragma pack ()               作用:取消自定義位元組對齊方式。

#pragma  pack (push,1)     作用:是指把原來對齊方式設定壓棧,並設新的對齊方式設定為乙個位元組對齊

#pragma pack(pop)            作用:恢復對齊狀態

因此可見,加入push和pop可以使對齊恢復到原來狀態,而不是編譯器預設,可以說後者更優,但是很多時候兩者差別不大

如:#pragma pack(push) //儲存對齊狀態

#pragma pack(4)//設定為4位元組對齊

相當於 #pragma  pack (push,4)  

#pragma  pack (1)           作用:調整結構體的邊界對齊,讓其以乙個位元組對齊;《使結構體按1位元組方式對齊》

#pragma  pack ()

例如:#pragma pack(1)

struct sample

;#pragma pack()

注:若不用#pragma pack(1)和#pragma pack()括起來,則sample按編譯器預設方式對齊(成員中size最大的那個)。即按8位元組(double)對齊,則sizeof(sample)==16.成員char a佔了8個位元組(其中7個是空位元組);若用#pragma pack(1),則sample按1位元組方式對齊sizeof(sample)==9.(無空位元組),比較節省空間啦,有些場和還可使結構體更易於控制。

應用例項

在網路協議程式設計中,經常會處理不同協議的資料報文。一種方法是通過指標偏移的方法來得到各種資訊,但這樣做不僅程式設計複雜,而且一旦協議有變化,程式修改起來也比較麻煩。在了解了編譯器對結構空間的分配原則之後,我們完全可以利用這一特性定義自己的協議結構,通過訪問結構的成員來獲取各種資訊。這樣做,不僅簡化了程式設計,而且即使協議發生變化,我們也只需修改協議結構的定義即可,其它程式無需修改,省時省力。下面以tcp協議首部為例,說明如何定義協議結構。其協議結構定義如下: 

#pragma pack(1) // 按照1位元組方式進行對齊

struct tcpheader 

; #pragma pack()

C 位元組對齊 pragma pack

對於結構體,編譯器會自動進行成員變數對齊處理,是為了提高運算效率。預設情況下是自然對齊方式。即預設對齊,按照結構體的成員中size最大的成員進行對齊。例 struct naturalalign 上述結構體,成員size最大的是c,sizeof c 為4,因此,結構體中的成員都以4為單位進行對齊,si...

C語言的位元組對齊及 pragma pack的使用

posted on 2010 04 15 11 14 delcpp 閱讀 623 編輯收藏 c編譯器的預設位元組對齊方式 自然對界 在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們...

C語言的位元組對齊及 pragma pack的使用

c編譯器的預設位元組對齊方式 自然對界 在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存 成員之間可能有插入的空位元組 第乙個成員的位址和整個結構的位...