設定結構體的邊界對齊為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...