pragma pack 1 的意義是什麼

2022-06-14 16:09:14 字數 794 閱讀 7100

設定結構體的邊界對齊為1個位元組,也就是所有資料在記憶體中是連續儲存的。

比如你在c語言中定義下面這樣的結構體:

struct s ;

然後在主函式中寫一句:printf("%d", sizeof(struct s))

也就是輸出結構體s所佔的位元組數

你覺得輸出結果會是多少呢?

我們知道,char型占用1個位元組,int型佔4個位元組,那麼輸出的結果是5嗎?

答案是否定的。你可以自己試一下,輸出結果為8。

為什麼會這樣呢?這是因為編譯器為了讓程式跑得跟快,減少cpu讀取資料的指令週期,對結構體的儲存進行了優化。實際上第乙個char型成員雖然本來只有1個位元組,但實際上卻占用掉了4個位元組,為的是讓第二個int型成員的位址能夠被4整除。因此實際占用的是8個位元組。

而#pragma pack(1)讓編譯器將結構體資料強制連續排列,這樣的話,sizeof(struct s)輸出的結果就是5了。

設定記憶體對齊為:1位元組對齊。使用方法如下:

#pragma pack(n)

struct s ;

#pragma pack()|  /*取消指定對齊,恢復預設對齊,等價於#pragma pack(pop)*/

意思就是 以下**編譯出來的是以1個位元組的方式對齊的。這樣能節約記憶體資源,但是會在效率上有所影響
可是,雖說在效率上有一定的影響,不過,如果編寫的是基於協議,如串列埠通訊的程式,那麼必須嚴格按照一定的規則進行接收資料報。那麼,只要#pragma pack(1),讓資料在記憶體中是連續的,才好處理的。

pragma pack 1 的意義是什麼

設定結構體的邊界對齊為1個位元組,也就是所有資料在記憶體中是連續儲存的。比如你在c語言中定義下面這樣的結構體 struct s 然後在主函式中寫一句 printf d sizeof struct s 也就是輸出結構體s所佔的位元組數 你覺得輸出結果會是多少呢?我們知道,char型占用1個位元組,in...

pragma pack 1 的意義是什麼

設定結構體的邊界對齊為1個位元組,也就是所有資料在記憶體中是連續儲存的。比如你在c語言中定義下面這樣的結構體 struct s 然後在主函式中寫一句 printf d sizeof struct s 也就是輸出結構體s所佔的位元組數 你覺得輸出結果會是多少呢?我們知道,char型占用1個位元組,in...

pragma pack 1 的作用是什麼?

設定結構體的邊界對齊為1個位元組,也就是所有資料在記憶體中是連續儲存的。比如你在c語言中定義下面這樣的結構體 struct s 然後在主函式中寫一句 printf d sizeof struct s 也就是輸出結構體s所佔的位元組數 你覺得輸出結果會是多少呢?我們知道,char型占用1個位元組,in...