結構體強制對齊


 
#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 保存當前對齊方式,設置按 字節對齊
#pragma pack ()             //取消自定義字節對齊方式
#pragma pack(show)   //顯示當前內存對齊的字節數
#pragma pack(push)      //保存當前對其方式到 packing stack
#pragma pack(push,n)   //是指把原來對齊方式設置壓棧,並設新的對齊方式設置為1個字節對齊
#pragma pack(pop)        //packing stack 出棧,並將對其方式設置為出棧的對齊方式
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM