在沒有外部干預的情況下,編譯器會根據作業系統及編譯環境來自動設定結構體的記憶體對齊的預設位元組,但是在實際開發中,有時候考慮到實際記憶體,會有將結構體設定為1位元組對齊(不對齊)的需求,這個時候就要借助c/c編譯指令#pragma pack(),這個指令也是非常複雜的,這裡只總結兩種常用的
#pragma pack(n)
//作用:c編譯器將對以下的結構體按照n個位元組對齊。
/* 定義結構體型別
*/#pragma pack()
//作用:取消自定義位元組對齊方式。
其中#pragma pack(n)
中,n
的有效引數為1/2/4/8/16
,這個時候編譯器會將讓n與預設的對齊位元組數進行比較,取較小值為對齊位元組數。
為了避免意外影響專案中其他結構成員的記憶體對齊,#pragma pack(n)
和#pragma pack()
是需要配對使用的,後者的作用是取消自定義的位元組對齊方式,使其他的結構體型別的變數按照編譯器預設的對齊位元組數進行記憶體對齊。在很多**中沒有配對使用,是及其不規範也是極其危險的行為!
在64位作業系統64位編譯器的環境下,當n ≥ 8時,記憶體對齊的位元組數是8,不然為n在32位作業系統32位編譯器的環境下,當n ≥ 4時,記憶體對齊的位元組數是4,不然為n
#include
typedef
struct mystruct1
ms1;
//in 64_64:24; in 32_32:16
#pragma pack(1)
typedef
struct p1mystruct1
p1ms1;
//in 64_64:13; in 32_32:13
#pragma pack()
#pragma pack(2)
typedef
struct p2mystruct1
p2ms1;
//in 64_64:14; in 32_32:14
#pragma pack()
#pragma pack(4)
typedef
struct p4mystruct1
p4ms1;
//in 64_64:16; in 32_32:16
#pragma pack()
#pragma pack(8)
typedef
struct p8mystruct1
p8ms1;
//in 64_64:24; in 32_32:16
#pragma pack()
#pragma pack(16)
typedef
struct p16mystruct1
p16ms1;
//in 64_64:24; in 32_32:16
#pragma pack()
typedef
struct mystruct2
ms2;
//in 64_64:24; in 32_32:16
intmain
(void
)
#pragma pack(push,n)
//作用:把原來對齊方式設定壓棧,並設新的對齊位元組為n的對齊方式
/* 定義結構體型別
*/#pragma pack(pop)
//作用:恢復原來壓棧的對齊方式。
在指令#pragma pack(push,n)
裡n的一切效果和#pragma pack(n)
中是一樣的,這裡不再贅述。這個指令的優越性在於:他設定新的對齊方式時,會將原來的對齊方式(假設是m)進行壓棧儲存下來。待#pragma pack(pop)
解除#pragma pack(push,n)
的作用時,將會對原來的對齊方式進行彈棧恢復,執行之後結構體的對齊方式又變回了m而不是編譯器預設的。
#include
typedef
struct mystruct1
ms1;
//in 64_64:24; in 32_32:16
#pragma pack(1)
typedef
struct p1mystruct1
p1ms1;
//in 64_64:13; in 32_32:13
#pragma pack(push, 2)
typedef
struct pp2mystruct1
pp2ms1;
//in 64_64:14; in 32_32:14
#pragma pack(pop)
typedef
struct p3mystruct1
p3ms1;
//in 64_64:13; in 32_32:13
#pragma pack()
typedef
struct mystruct2
ms2;
//in 64_64:24; in 32_32:16
#pragma pack(push, 1)
typedef
struct pp1mystruct1
pp1ms1;
//in 64_64:13; in 32_32:13
#pragma pack(pop)
#pragma pack(push, 16)
typedef
struct pp16mystruct1
pp16ms1;
//in 64_64:24; in 32_32:16
#pragma pack(pop)
typedef
struct mystruct3
ms3;
//in 64_64:24; in 32_32:16
intmain
(void
)
關於#pragma pack()
指令不再做更深入的講述,在gcc中也較少使用這個指令。 gcc推薦的用__ attribute__ 關於pragma pack的用法(一)
乙個很重要的引數 pragma pack n 資料邊界對齊方式 以如下結構為例 struct 在windows預設結構大小 sizeof struct 4 4 4 4 16 與 pragma pack 4 一樣 若設為 pragma pack 1 則結構大小 sizeof struct 1 2 4 ...
C語言中的 pragma pack()
這幾天生病了,還沒痊癒,估計要等到下週才能完全復工。pragma的用法為 pragma pra pra是引數。pra有很多種,這裡只說一種。pragma pack 如 progma pack 2 指定按2位元組對齊 struct c progma pack 取消指定對齊,恢復預設對齊 pragma ...
c c 的程式設計規範
乙個程式設計師的編碼水平如何,從他寫的 的風格,布局就可以看出來。所以良好的編碼風格是非常重要的。清晰易讀的 才是高質量的 下面是我從網上找到的乙個關於編碼風格的帖子。對於程式設計的初學者比較有用,高手就不必瀏覽了。一 每日編寫如此之多的 很多同學現在的想法是,我要實現功能,實現了功能以後,萬事大吉...