#pragma pack(n)對齊方式:
#pragma pack (n) //編譯器將按照n個字節對齊。
#pragma pack () //取消自定義字節對齊方式。
在#pragma pack (n) 和#pragma pack ()之間的代碼按n字節對齊。
#include<stdio.h> #pragma pack(show) #pragma pack(1) #pragma pack(show) typedef struct student { char a; //設置1個字節對齊,char 是1個字節,以1字節對齊,按1個字節處理 short b; //設置1個字節對齊,short 是2個字節,以1字節對齊,按2個字節處理 int c; //設置1個字節對齊,int 是4個字節,以1字節對齊,按4個字節處理 float d; //設置1個字節對齊,float 是4個字節,以1字節對齊,按4個字節處理 double e; //設置1個字節對齊,double 是8個字節,以1字節對齊,按8個字節處理 long f; //設置1個字節對齊,long 是4個字節,以1字節對齊,按4個字節處理 unsigned char g; //設置1個字節對齊,unsigned char 是1個字節,以1字節對齊,按1個字節處理 unsigned short h; //設置1個字節對齊,unsigned short 是2個字節,以1字節對齊,按2個字節處理 unsigned int i; //設置1個字節對齊,unsigned int 是4個字節,以1字節對齊,按4個字節處理 }student; #pragma pack(show) #pragma pack() #pragma pack(show) int main() { printf("%d",sizeof(student)); return 0; }
可以以一個字節對齊,因為一般的數據類型都是大於等於1個字節的。這樣的話就會按照數據類型原有的的分配,就不會錯位了。
這里有三點很重要:
1、
每個成員分別按自己的方式對齊,並能最小化長度。
2、復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度。
3、
對齊后的長度必須是成員中最大的對齊參數的整數倍,這樣在處理數組時可以保證每一項都邊界對齊。
補充一下,對於數組,比如:char a[3];它的對齊方式和分別寫 3 個 char 是一樣的。也就是說它還是按 1 個字節對齊。
如果寫 typedef char Array3[3];Array3 這種類型的對齊方式還是按 1個字節對齊,而不是按它的長度。
但是不論類型是什么,對齊的邊界一定是 1,2,4,8,16,32,64....中的一個。
#pragma pack 的用法:
#pragma pack(n) //n=1,2,4,8,16 保存當前對齊方式,設置按 n 字節對齊
#pragma pack () //取消自定義字節對齊方式
#pragma pack(show) //顯示當前內存對齊的字節數
#pragma pack(push) //保存當前對其方式到 packing stack
#pragma pack(push,n) //是指把原來對齊方式設置壓棧,並設新的對齊方式設置為1個字節對齊
#pragma pack(pop) //packing stack 出棧,並將對其方式設置為出棧的對齊方式
#pragma pack(push) //保存當前對其方式到 packing stack
#pragma pack(push,n) //是指把原來對齊方式設置壓棧,並設新的對齊方式設置為1個字節對齊
#pragma pack(pop) //packing stack 出棧,並將對其方式設置為出棧的對齊方式