若是不想讓struct內存對齊,只須要標記對齊方式爲1便可code
#pragma pack(1)
咱們知道當內存的邊界正好對齊在相應機器字長邊界上時,CPU的執行效率最高,爲了保證效率,在VC++平臺上內存對齊都是默認打開的,在32位機器上內存對齊的邊界爲4字節;好比看以下的代碼:內存
struct MyStruct { int i; char c; }; int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(MyStruct)<<endl; return 0; }
此時輸出的結果並非sizeof(int) + sizeof(char) = 5而是8,由於內存對齊的緣由,將char分配爲4個字節效率更高;編譯器
在VC平臺上咱們能夠經過預處理指令:#pragma pack(show)來查看當前內存對齊的方式,咱們在代碼前加上一句#pragma pack(show),再次編譯,在編譯器的「生成」窗口中看到一個警告:「warning C4810: 雜注 pack(show) 的值 == 8」說明這時編譯器採用的是8字節的對齊方式,另外能夠經過這個預處理指令更改對齊方式,好比將代碼改寫一下:編譯
#pragma pack(show) #pragma pack(1) struct MyStruct { int i; char c; }; int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(MyStruct)<<endl; system("PAUSE"); return 0; }
這個時候獲得結果爲5,也就是說咱們已經將對齊方式改成了1;
除了這個預處理指令咱們也能夠經過VC++擴展關鍵字align來改變內存的對齊方式:class
#pragma pack(show) #pragma pack(1) struct MyStruct { int i; char c; }; struct __declspec(align(1)) MyStruct1 { int i; char c; }; int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(MyStruct)<<endl; cout<<sizeof(MyStruct1)<<endl; system("PAUSE"); return 0; }
這個時候輸出的結果爲兩個5;效率