現代計算機中內存空間都是按照byte劃分的,從理論上講彷佛對任何類型的變量的訪問能夠從任何地址開始,但實際狀況是在訪問特定變量的時候常常在特定的內存地址訪問,這就須要各種型數據按照必定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。數據結構
爲何要了解內存對齊:各個硬件平臺對存儲空間的處理上有很大的不一樣。一些平臺對某些特定類型的數據只能從某些特定地址開始存取。其餘平臺可能沒有這種狀況,可是最多見的是若是不按照適合其平臺要求對數據存放進行對齊,會在存取效率上帶來損失。好比有些平臺每次讀都是從偶地址開始,若是一個int型(假設爲32位系統)若是存放在偶地址開始的地方,那麼一個讀週期就能夠讀出,而若是存放在奇地址開始的地方,就可能會須要2個讀週期,並對兩次讀出的結果的高低字節進行拼湊才能獲得該int數據。顯然在讀取效率上降低不少。這也是空間和時間的博弈。性能
一般咱們不須要去主動進行內存對齊的操做,編譯器會自動爲咱們選擇最優的對齊規則方式,合理利用空間節省程序運行的時間,但如果咱們能瞭解這種規則,對於咱們編寫程序仍是會有很大的幫助的。spa
1 #pragma pack(1)//讓編譯器對此結構體做字節對齊 2 struct A 3 { 4 char a;// 1 5 int b;// 4 6 short c;// 2 7 long d;// 4 8 float e;// 4 9 }; 10 #pragma pack()//取消字節對齊,回覆默認字節對齊 11 int main() 12 { 13 struct A a; 14 printf("%d\n",sizeof(a)); 15 return 0; 16 }
1 #include <stdio.h> 2 //#pragma pack(1)//讓編譯器對此結構體做字節對齊 3 struct A 4 { 5 char a;// 1 6 int b;// 4 7 short c;// 2 8 long d;// 4 9 float e;// 4 10 }; 11 //#pragma pack()//取消字節對齊,回覆默認字節對齊 12 int main() 13 { 14 struct A a; 15 printf("%d\n",sizeof(a)); 16 return 0; 17 }
程序運行:操作系統
1 #include <stdio.h> 2 //#pragma pack(1)//讓編譯器對此結構體做字節對齊 3 struct A 4 { 5 char a;// 1 6 int b;// 4 7 short c;// 2 8 //long d;// 4 9 //float e;// 4 10 }; 11 //#pragma pack()//取消字節對齊,回覆默認字節對齊 12 int main() 13 { 14 struct A a; 15 printf("%d\n",sizeof(a)); 16 return 0; 17 }
程序運行:code
1 #include <stdio.h> 2 //#pragma pack(1)//讓編譯器對此結構體做字節對齊 3 struct A 4 { 5 char a;// 1 6 //int b;// 4 7 short c;// 2 8 long d;// 4 9 char g;// 1 10 //float e;// 4 11 }; 12 //#pragma pack()//取消字節對齊,回覆默認字節對齊 13 int main() 14 { 15 struct A a; 16 printf("%d\n",sizeof(a)); 17 return 0; 18 }
程序運行:blog
1 #include <stdio.h> 2 3 struct A 4 { 5 char a; 6 int b; 7 short c; 8 }; 9 struct B 10 { 11 char a; 12 short b; 13 int c; 14 }; 15 int main() 16 { 17 struct A a; 18 struct B b; 19 printf("%d\n",sizeof(a)); 20 printf("%d\n",sizeof(b)); 21 return 0; 22 }
程序運行:內存