VC++平臺上的記憶體對齊操作
阿新 • • 發佈:2019-01-16
我們知道當記憶體的邊界正好對齊在相應機器字長邊界上時,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來改變記憶體的對齊方式:
#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;
.